Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП 
:(
    Опции темы
Fubu_By
Дата 27.3.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 14.2.2007

Репутация: нет
Всего: 0



помогите разобраться как делать

есть допустим у меня клас для работы с БД и ещё один класс для работы с сесиями допустим, как мне сделать чтобы третий класс наследовал методы обоих классов? один через другой типо третий наследует второй, а второй первый не подходит.


--------------------
PM MAIL WWW   Вверх
awers
Дата 27.3.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



ну насколько я знаю множественное наследование в пхп нету. может стоит как то по другому организовать? я уверен есть выход.
PM MAIL WWW ICQ Skype   Вверх
be_nt_all
Дата 27.3.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.2.2007
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(Fubu_By @  27.3.2008,  12:47 Найти цитируемый пост)
есть допустим у меня клас для работы с БД и ещё один класс для работы с сесиями допустим, как мне сделать чтобы третий класс наследовал методы обоих классов?

Пример имхо, надуманный...

Цитата(awers @  27.3.2008,  12:56 Найти цитируемый пост)
ну насколько я знаю множественное наследование в пхп нету. может стоит как то по другому организовать? я уверен есть выход. 

А выход разумеется есть. В PHP5 (там ещё и не такое можно сделать). 

Например, чтобы сделать доступными реализации методов из второго базового класса, присваеваем экземпляр этого класса некой переменной класса 1 (в конструкторе, разумеется) и определяем в классе1 метод __call, перенаправляющий вызовы на отсутствующие в классе 1 методы этому экземпляру класса 2.

Ну и чтобы полиморфизм работал в полную силу - используем множественное наследование интерфейсов. 
Для чистоты стиля, в качестве доп. уровня защиты от ошибок, для правильной работы autocompletion в ZendStudio и т.п. можно использовать множественное наследование интерфейсов, хотя и без них вполне можно обойтись.

Пример писать сейчас некогда, но наиинтереснейший способ издевательства над механизмами ООП в PHP можно найти напр. тут:  динамическое множественное наследование (прототипы) на пхп


Это сообщение отредактировал(а) be_nt_all - 27.3.2008, 15:27
PM MAIL WWW   Вверх
Fubu_By
Дата 27.3.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 14.2.2007

Репутация: нет
Всего: 0



Цитата(be_nt_all @ 27.3.2008,  15:16)
Цитата(Fubu_By @  27.3.2008,  12:47 Найти цитируемый пост)
есть допустим у меня клас для работы с БД и ещё один класс для работы с сесиями допустим, как мне сделать чтобы третий класс наследовал методы обоих классов?

Пример имхо, надуманный...

Цитата(awers @  27.3.2008,  12:56 Найти цитируемый пост)
ну насколько я знаю множественное наследование в пхп нету. может стоит как то по другому организовать? я уверен есть выход. 

А выход разумеется есть. В PHP5 (там ещё и не такое можно сделать). 

Например, чтобы сделать доступными реализации методов из второго базового класса, присваеваем экземпляр этого класса некой переменной класса 1 (в конструкторе, разумеется) и определяем в классе1 метод __call, перенаправляющий вызовы на отсутствующие в классе 1 методы этому экземпляру класса 2.

Ну и чтобы полиморфизм работал в полную силу - используем множественное наследование интерфейсов. 
Для чистоты стиля, в качестве доп. уровня защиты от ошибок, для правильной работы autocompletion в ZendStudio и т.п. можно использовать множественное наследование интерфейсов, хотя и без них вполне можно обойтись.

Пример писать сейчас некогда, но наиинтереснейший способ издевательства над механизмами ООП в PHP можно найти напр. тут:  динамическое множественное наследование (прототипы) на пхп

пример не надуманный
я считываю данные из БД и закидываю в сесию, методы для БД беру из одного класса а методы для работы с сессией с другого...

если не сложно сложно напиши пример один при помощи интерфейсов а второй при помощи __call
а тот пример что ты дал ссылку реально извращённый smile ну всёравно спс поковыряю может быстрее всётаки дойдёт


--------------------
PM MAIL WWW   Вверх
solenko
Дата 27.3.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Цитата(Fubu_By @  27.3.2008,  14:57 Найти цитируемый пост)
я считываю данные из БД и закидываю в сесию, методы для БД беру из одного класса а методы для работы с сессией с другого...

Ну так это и нормально. Сессия и база разные сущности -- им просто нечего делать в одном классе. Честно говоря, мне тяжело представить себе класс котрый наследует функционал работы с сессиям и с базой. Может быть опишеш задачи, которые дложен решать этот третий класс, а, исходя из этого все вместе подумаем как лучшу сделать?



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
be_nt_all
Дата 27.3.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.2.2007
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(Fubu_By @  27.3.2008,  13:57 Найти цитируемый пост)
я считываю данные из БД и закидываю в сесию, методы для БД беру из одного класса а методы для работы с сессией с другого...


И что нам мешает просто использовать объекты класса БазаДанных и класса Сессия?

Цитата(Fubu_By @  27.3.2008,  13:57 Найти цитируемый пост)

если не сложно сложно напиши пример один при помощи интерфейсов а второй при помощи __call
а тот пример что ты дал ссылку реально извращённый smile ну всёравно спс поковыряю может быстрее всётаки дойдёт 


Можно сделать проще, но мало мальски корректная реализация множественного наследования намного проще не будет. См. метод _findByMethod (к-й и вызывается из _call) в базовом классе от dark-demon-а. Там использована рекурсия, в результате которой классы "делегатов" будут иметь доступ к методам друг-друга (аналогично для свойств -  _findByProp и метод __get). Можно заменить весь этот рекурсивный обход на что-то вроде 
Код

return call_user_func_array(array($this->obj , $method),  $args);

где obj - экземпляр класса2, но так мы не будем видеть твой объект из obj, если ты об этом специально не позаботишься.

Интерфейсы ничего принципиального к этой схеме не добавят - это просто элементы строгой типизации, без которых в слабо-типизированном ПХП вполне можно обойтись. 

А вообще почитай главы об ОО-модели PHP5 у Гутманса (PHP5 - проф. прогр-ие) или Котерова (PHP5 в подлиннике) (ну или ещё где нибудь - информации хватает).

В общем - множественное наследование мощный, но сложный механизм, и прежде чем его использовать (даже в С++ где оно - часть базового языка), стоит подумать, какие реальные преимущества оно даёт для решаемой задачи.

Добавлено через 3 минуты и 38 секунд
Цитата(solenko @  27.3.2008,  14:10 Найти цитируемый пост)
. Сессия и база разные сущности -- им просто нечего делать в одном классе. Честно говоря, мне тяжело представить себе класс котрый наследует функционал работы с сессиям и с базой. 


Легко могу представить классы БД и Сессии, реализующие некий общий интерфейс (сохранить что-то, взять это самое что-то обратно). Но реализация методов save и load будет совершенно различной.

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.