![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Fubu_By |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 14.2.2007 Репутация: нет Всего: 0 |
помогите разобраться как делать
есть допустим у меня клас для работы с БД и ещё один класс для работы с сесиями допустим, как мне сделать чтобы третий класс наследовал методы обоих классов? один через другой типо третий наследует второй, а второй первый не подходит. |
|||
|
||||
awers |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1465 Регистрация: 22.3.2006 Где: Россия, Таганрог Репутация: 21 Всего: 31 |
ну насколько я знаю множественное наследование в пхп нету. может стоит как то по другому организовать? я уверен есть выход.
|
|||
|
||||
be_nt_all |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 27.2.2007 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Пример имхо, надуманный...
А выход разумеется есть. В PHP5 (там ещё и не такое можно сделать). Например, чтобы сделать доступными реализации методов из второго базового класса, присваеваем экземпляр этого класса некой переменной класса 1 (в конструкторе, разумеется) и определяем в классе1 метод __call, перенаправляющий вызовы на отсутствующие в классе 1 методы этому экземпляру класса 2. Ну и чтобы полиморфизм работал в полную силу - используем множественное наследование интерфейсов. Для чистоты стиля, в качестве доп. уровня защиты от ошибок, для правильной работы autocompletion в ZendStudio и т.п. можно использовать множественное наследование интерфейсов, хотя и без них вполне можно обойтись. Пример писать сейчас некогда, но наиинтереснейший способ издевательства над механизмами ООП в PHP можно найти напр. тут: динамическое множественное наследование (прототипы) на пхп Это сообщение отредактировал(а) be_nt_all - 27.3.2008, 15:27 |
||||
|
|||||
Fubu_By |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 290 Регистрация: 14.2.2007 Репутация: нет Всего: 0 |
пример не надуманный я считываю данные из БД и закидываю в сесию, методы для БД беру из одного класса а методы для работы с сессией с другого... если не сложно сложно напиши пример один при помощи интерфейсов а второй при помощи __call а тот пример что ты дал ссылку реально извращённый ![]() |
||||||
|
|||||||
solenko |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 34 Всего: 67 |
Ну так это и нормально. Сессия и база разные сущности -- им просто нечего делать в одном классе. Честно говоря, мне тяжело представить себе класс котрый наследует функционал работы с сессиям и с базой. Может быть опишеш задачи, которые дложен решать этот третий класс, а, исходя из этого все вместе подумаем как лучшу сделать? -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
be_nt_all |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 27.2.2007 Где: Ростов-на-Дону Репутация: нет Всего: нет |
И что нам мешает просто использовать объекты класса БазаДанных и класса Сессия? Можно сделать проще, но мало мальски корректная реализация множественного наследования намного проще не будет. См. метод _findByMethod (к-й и вызывается из _call) в базовом классе от dark-demon-а. Там использована рекурсия, в результате которой классы "делегатов" будут иметь доступ к методам друг-друга (аналогично для свойств - _findByProp и метод __get). Можно заменить весь этот рекурсивный обход на что-то вроде
где obj - экземпляр класса2, но так мы не будем видеть твой объект из obj, если ты об этом специально не позаботишься. Интерфейсы ничего принципиального к этой схеме не добавят - это просто элементы строгой типизации, без которых в слабо-типизированном ПХП вполне можно обойтись. А вообще почитай главы об ОО-модели PHP5 у Гутманса (PHP5 - проф. прогр-ие) или Котерова (PHP5 в подлиннике) (ну или ещё где нибудь - информации хватает). В общем - множественное наследование мощный, но сложный механизм, и прежде чем его использовать (даже в С++ где оно - часть базового языка), стоит подумать, какие реальные преимущества оно даёт для решаемой задачи. Добавлено через 3 минуты и 38 секунд Легко могу представить классы БД и Сессии, реализующие некий общий интерфейс (сохранить что-то, взять это самое что-то обратно). Но реализация методов save и load будет совершенно различной. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |