Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > ООП


Автор: Fubu_By 27.3.2008, 14:47
помогите разобраться как делать

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

Автор: awers 27.3.2008, 14:56
ну насколько я знаю множественное наследование в пхп нету. может стоит как то по другому организовать? я уверен есть выход.

Автор: 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 можно найти напр. тут:  http://php.ru/forum/viewtopic.php?t=7870

Автор: Fubu_By 27.3.2008, 15:57
Цитата(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 можно найти напр. тут:  http://php.ru/forum/viewtopic.php?t=7870

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

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

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

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

Автор: be_nt_all 27.3.2008, 16:26
Цитата(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 будет совершенно различной.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)