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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП, наследование всех классов 
:(
    Опции темы
Marena
Дата 13.8.2009, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день.
Как сделать чтобы конечный класс Base мог вызывать ф-ции других классов (Test1, Test2, Test3, ...)

Код

<?php
error_reporting(E_ALL);

class Test1{
    public function f_test1()
    {
        echo 'function test1 <br />';
    } 
}


class Test2{
    public function f_test2()
    {
        echo 'function test2 <br />';
    } 
}


class Test3{
    public function f_test3()
    {
        echo 'function test3 <br />';
    } 
}


class Base{
    public function Base()
    {
        $this->f_test1;    //    ?
        $this->f_test2;    //    ?
        $this->f_test3;    // ?
    }  
}

?>

PM MAIL   Вверх
youri
Дата 13.8.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



обычно необходимость в множественном наследовании означает неправильно выбранный способ решения задачи. Зачем понадобилось множественное наследование?
PM   Вверх
NewDima
Дата 13.8.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

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



Marena, множественное наследование не поддерживается в php, по причине, о которой сказал youri.
PM ICQ   Вверх
bars80080
Дата 13.8.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(youri @  13.8.2009,  08:49 Найти цитируемый пост)
Зачем понадобилось множественное наследование? 

ну хотя бы в том случае, когда у нас для решения задач используются разные классы. и в какой-то отдельной ситуации потребовалось использовать сразу несколько. в дальнейшем приходится передавать ссылку на объект и возникает проблема - приходится передавать ссылки на все объекты. вот и вопрос, почему бы не отнаследовать все нужные классы в один объект?
PM MAIL WWW   Вверх
NewDima
Дата 13.8.2009, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

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



bars80080, по-моему здесь и применяется рефакторинг, если приходится передавать кучу ссылок одному классу.Может стоит объединить  базовые классы?
PM ICQ   Вверх
bars80080
Дата 13.8.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(NewDima @  13.8.2009,  09:50 Найти цитируемый пост)
Может стоит объединить  базовые классы?

вместе они используются очень редко. а вот именно в редком случае хотелось бы склеивать их в один
PM MAIL WWW   Вверх
solenko
Дата 13.8.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bars80080 @  13.8.2009,  08:30 Найти цитируемый пост)
ну хотя бы в том случае, когда у нас для решения задач используются разные классы. и в какой-то отдельной ситуации потребовалось использовать сразу несколько. в дальнейшем приходится передавать ссылку на объект и возникает проблема - приходится передавать ссылки на все объекты. вот и вопрос, почему бы не отнаследовать все нужные классы в один объект?

Конкретный пример в студию


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


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: -1
Всего: 17



а к элементу хэша нельзя прицепить ссылку на объект какого-то класса?

Это сообщение отредактировал(а) gcc - 13.8.2009, 10:47
PM WWW ICQ Skype GTalk Jabber   Вверх
bars80080
Дата 13.8.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(solenko @  13.8.2009,  10:00 Найти цитируемый пост)
Конкретный пример в студию 

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

вот и получается, что приходится делать не универсальные решения, где приходится либо создавать объект из свойства класса:
$this->db = new DB();
но этот вариант не удобен тем, что зачем запускать ещё раз соединение с БД, если оно уже есть в другом объекте?
либо передавать объект с помощью global, что попахивает частным не гибким решением

если бы можно было отнаследовать ряд нужных классов в один, да ещё по ходу действия - это было отлично
PM MAIL WWW   Вверх
MoLeX
Дата 13.8.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Цитата(bars80080 @  13.8.2009,  10:48 Найти цитируемый пост)
либо передавать объект с помощью global, что попахивает частным не гибким решением

не совсем гуд через глобал


Цитата(bars80080 @  13.8.2009,  10:48 Найти цитируемый пост)
если бы можно было отнаследовать ряд нужных классов в один, да ещё по ходу действия - это было отлично 

разработчики не учли этого момента.

Добавлено через 26 секунд
Интересно, а через какой-нить изврат это удасться сделать? 

Добавлено через 44 секунды
Цитата(gcc @  13.8.2009,  10:12 Найти цитируемый пост)
а к элементу хэша нельзя прицепить ссылку на объект какого-то класса?

это как?!


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
gcc
Дата 13.8.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: -1
Всего: 17



я не пробовал, а что нельзя?
зачем тогда придумали клонирование объекта?
PM WWW ICQ Skype GTalk Jabber   Вверх
solenko
Дата 13.8.2009, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



1. Кроме наследования есть еще и композиция
2. Если пропустили, я тут статейку переводил про внедрение зависимостей... Посмотрите -- вам может быть интерестно

3. Что значит "построение страници для типа 1"? Чем занимается класс? Сборкой страници? Что в нем делать авторизации? Если у вас есть существенно разные типы страниц, и вы таки хотите использовать наследование, почему у вас нет:
Код

abstact class BasePage {
}

class ConcretePage1 extends BasePage {
}

class ConcretePage2 extends BasePage {
}

?

Когда я говорил о конкретном примере, я имел в виду нечто более конкретное чем вы привели.

Добавлено через 4 минуты и 54 секунды
Цитата(gcc @  13.8.2009,  10:28 Найти цитируемый пост)
зачем тогда придумали клонирование объекта?

Не поверите, для клонирования объекта )
Вот простейший пример:
Код


$a = new stdClass();
$a->test = 'a';
$b = $a;
$b->test = 'b';
echo $a->test,PHP_EOL;

$c = new stdClass();
$c->test = 'c';
$d = clone $c;
$d->test = 'd';
echo $c->test,PHP_EOL;

А ведь могут быть и сложные правила создания копии объекта, которые можно определить в __clone


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


Новичок



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

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



А чем Вам действительно не подходит клонирование ? Создаете объекты нужных Вам классов внутри своего и пользуетесь их функциями наздоровье!?

PM MAIL WWW   Вверх
bars80080
Дата 13.8.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(solenko @  13.8.2009,  11:28 Найти цитируемый пост)
Что значит "построение страници для типа 1"?

условное название

Цитата(solenko @  13.8.2009,  11:28 Найти цитируемый пост)
Чем занимается класс? Сборкой страници? Что в нем делать авторизации?

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

Цитата(solenko @  13.8.2009,  11:28 Найти цитируемый пост)
abstact class BasePage {
}

class ConcretePage1 extends BasePage {
}

class ConcretePage2 extends BasePage {
}

да, это можно, но это то что называется от противного. т.е. создавать универсальный класс и делать два потомка с расширениями. но из-за этого придётся переписывать уже существующие. 


Цитата(solenko @  13.8.2009,  11:28 Найти цитируемый пост)
Когда я говорил о конкретном примере, я имел в виду нечто более конкретное чем вы привели.

ну, я уж не знаю как подробнее


Цитата(Chupach1979 @  13.8.2009,  12:23 Найти цитируемый пост)
Создаете объекты нужных Вам классов внутри своего и пользуетесь их функциями наздоровье!?

да вот, простейший пример. у меня уже открыто соединение в одном объекте, зачем мне создавать ещё одно в пределах одного сеанса
?
PM MAIL WWW   Вверх
perloid
Дата 13.8.2009, 13:37 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Эксперт
***


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

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



Цитата(bars80080 @  13.8.2009,  12:02 Найти цитируемый пост)
нечто среднее. грубо говоря, на входе адрес url, на выходе готовая страница,

Т.е. класс, который занимается ВСЕМ? 

Цитата(bars80080 @  13.8.2009,  12:02 Найти цитируемый пост)
собранная из разных модулей. авторизация создаёт массив прав для этих модулей для конкретного пользователя, 

И почему это должны быть разные классы? Не авторизирован -- это тоже состояние пользователя и набор прав. В чем отличия сборки?


Цитата(bars80080 @  13.8.2009,  12:02 Найти цитируемый пост)
фича с авторизацией и разгребанием дополнительных прибабахов занимает примерно столько же места, так что клепать в одно и таскать затем никакого желания нет

что такое дополнительные прибабахи? примерно столько же сколько и что и причем тут вообще мето? Таксать откуда куда?
И т.д. и т.п.

С телепатией  у меня, видимо не очень, потому как не видя кода не могу определить что такое "прибабах", в чем заключаются различия в сборке и т.д.


Цитата(bars80080 @  13.8.2009,  12:02 Найти цитируемый пост)
ну, я уж не знаю как подробнее

Подробнее это может быть:
1. Исходный код
2. Описание взаимодействия классов. Без абстрактных фич и прибабахов, а с конкретными именами и алгоритмами.

Добавлено через 49 секунд
perloid, причем тут интерфейсы, которые не могут содержать реализации?


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


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(solenko @  13.8.2009,  13:49 Найти цитируемый пост)
Т.е. класс, который занимается ВСЕМ? 

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

Цитата(solenko @  13.8.2009,  13:49 Найти цитируемый пост)
Не авторизирован -- это тоже состояние пользователя и набор прав. В чем отличия сборки?

ёпрст!
вода, песок и цемент используется в разных местах, но в одном месте отливаются статуи, в другом фундамент. я что должен пользоваться одной машиной для обоих целей? мне всего лишь нужно унаследовать бетономешалку и грузовики, два класса, которые поотдельности могут использоваться и в других предприятиях


Цитата(solenko @  13.8.2009,  13:49 Найти цитируемый пост)
1. Исходный код
2. Описание взаимодействия классов. Без абстрактных фич и прибабахов, а с конкретными именами и алгоритмами.

а это уже невозможно, по причине полуразобранности системы. как раз в основном потому что не нравятся такие нюансы
PM MAIL WWW   Вверх
NewDima
Дата 13.8.2009, 14:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

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



solenko, код с php.net
Код

interface ElectricalDevice{
  public function power_on();
  public function power_off();
}

interface FrequencyTuner{
  public function get_frequencey();
  public function set_frequency($f);
}

class ElectricFan implements ElectricalDevice{
  // define ElectricalDevice...
}

class MicrowaveOven implements ElectricalDevice{
  // define ElectricalDevice...
}

class StereoReceiver implements ElectricalDevice, FrequencyTuner{
  // define ElectricalDevice...
  // define FrequencyTuner...
}


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

Это сообщение отредактировал(а) NewDima - 13.8.2009, 14:20
PM ICQ   Вверх
icewind
Дата 13.8.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Интерфейс не может содержать реализации. Являясь абстрактной сущьностью он просто описывает класс. В общем, один класс может быть определен множеством интерфейсов, но всю реализацию методов должен содержать сам.


--------------------
user posted image
PM MAIL Skype   Вверх
solenko
Дата 13.8.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



bars80080, я так и не получил ответа в чем принципиальная разница в сборке страницы

Цитата(bars80080 @  13.8.2009,  13:15 Найти цитируемый пост)
вода, песок и цемент используется в разных местах, но в одном месте отливаются статуи, в другом фундамент. я что должен пользоваться одной машиной для обоих целей?


Ок. Давайте поговорим аналогиями.
А теперь представляем что все это находится на территории какого-то предприятия... Вы водителя по машине допускать будете или таки по его документам? И в разные цеха он с разными правами доступа будет ходить не по машине. 

Цитата(bars80080 @  13.8.2009,  13:15 Найти цитируемый пост)
мне всего лишь нужно унаследовать бетономешалку и грузовики, два класса, которые поотдельности могут использоваться и в других предприятиях

Угу. Наследование должно получится приблизительно такое:
Автомобиль -> Грузовик -> Самосвал
Автомобиль -> Грузовик -> Бетономешалка

Вот только у Автомобиля УЖЕ есть водитель (ползователь). Для того, чтобы водить грузовик, водитель должен иметь определенную категорию (набор прав) А вот самосвал или бетономешалку он водит -- уже пофиг.

Цитата(bars80080 @  13.8.2009,  13:15 Найти цитируемый пост)
а это уже невозможно, по причине полуразобранности системы. как раз в основном потому что не нравятся такие нюансы

Ну тогда этот разговор так и останется о бетономешалках, пестиках и тычинках. Без конкретики это звучит так:
"У меня есть проблемма. Какая не скажу, но стандартные пути решения не подходят".



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


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(solenko @  13.8.2009,  15:42 Найти цитируемый пост)
я так и не получил ответа в чем принципиальная разница в сборке страницы

более конкретного не получишь


Цитата(solenko @  13.8.2009,  15:42 Найти цитируемый пост)
Вы водителя по машине допускать будете или таки по его документам?

есть два предприятия рядом: консервное и оборонное. без документов при попытке въехать на оборонное водителя пристрелят


Цитата(solenko @  13.8.2009,  15:42 Найти цитируемый пост)
Угу. Наследование должно получится приблизительно такое:
Автомобиль -> Грузовик -> Самосвал
Автомобиль -> Грузовик -> Бетономешалка

нет, я имел ввиду другое:

бетономешалка -> моёПредприятие
грузовик -> моёПредприятие

грузовик -> чужаяФерма
комбайн -> чужаяФерма



Цитата(solenko @  13.8.2009,  15:42 Найти цитируемый пост)
Ну тогда этот разговор так и останется о бетономешалках, пестиках и тычинках. Без конкретики это звучит так:
"У меня есть проблемма. Какая не скажу, но стандартные пути решения не подходят".

дык, это не моя проблема. не я топикстартер. автор задал вопрос, ему поставили в укор, что это неправильно. я далее стал разъяснять какая может быть задача.
у меня есть такая заморочка, но не слишком уж важная. однако, если есть решение или конкретное указание как тогда перестраивать ситему - хотел бы послушать

в аналогиях пока чётче получается
PM MAIL WWW   Вверх
NewDima
Дата 13.8.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

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



Цитата(bars80080 @ 14.8.2009,  00:46)
бетономешалка -> моёПредприятие
грузовик -> моёПредприятие
грузовик -> чужаяФерма
комбайн -> чужаяФерма

вы считаете, что такое наследование имеет право на существование?
PM ICQ   Вверх
solenko
Дата 13.8.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bars80080 @  13.8.2009,  16:46 Найти цитируемый пост)
более конкретного не получишь


Цитата(bars80080 @  13.8.2009,  16:46 Найти цитируемый пост)
однако, если есть решение или конкретное указание как тогда перестраивать ситему - хотел бы послушать

Учитывая первую цитату конкретнее чем "ну вот по-другому" не получиш )

Цитата(bars80080 @  13.8.2009,  16:46 Найти цитируемый пост)
есть два предприятия рядом: консервное и оборонное. без документов при попытке въехать на оборонное водителя пристрелят

Возвращаемся к программированию... 
Водитель без документов (неавторизированный пользователь) -- не попадет никуда (смотрит только страници с общим доступом)
Пользователь с обычым допуском (авторизированный пользователь) -- попадет на консервный завод (ну... личный кабинет, например)
Пользователь с полным допуском (админ) -- попадет на оборонку (backend)

Вот только машине (мега-класс-компонующий-страницу) пофиг имеет ли ее шофер документы. Все решеия принимаются предприятиями (конкретными модулями).


Цитата(bars80080 @  13.8.2009,  16:46 Найти цитируемый пост)
нет, я имел ввиду другое:
бетономешалка -> моёПредприятие
грузовик -> моёПредприятие

грузовик -> чужаяФерма
комбайн -> чужаяФерма


Да, это совсем другое. Это непонятно какие отношения между несвязанными объектами.



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


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(NewDima @  13.8.2009,  18:09 Найти цитируемый пост)
вы считаете, что такое наследование имеет право на существование? 

в реальности как-то прокатывает

Цитата(solenko @  13.8.2009,  19:33 Найти цитируемый пост)
Учитывая первую цитату конкретнее чем "ну вот по-другому" не получиш )

у меня с мягким знаком


Цитата(solenko @  13.8.2009,  19:33 Найти цитируемый пост)
Вот только машине (мега-класс-компонующий-страницу) пофиг имеет ли ее шофер документы

да, и возникает резонный вопрос, зачем мне для перемещения между двумя городами на расстояние в 50 км космический корабль?

есть первичный класс, который определяет в какую часть сайта лезет пользователь. каждая отдельная часть имеет свой механизм работы, к примеру, блок независимых модулей имеет в классе-построителе всего два метода, первый ищет модуль, второй отдаёт ему управление, блок непосредственно сайта имеет более сложную структуру, включающую построение меню, наполнение различных контентных частей, подключение обязательных сопроводительных модулей /типа календари, погодники и прочая/, и отдаёт управление только в конце.
но вполне логично, что блок сайта и блок админской части имеют схожее построение, за исключением нескольких методов и свойств. но методы эти громоздкие и требуют дополнительных ресурсов на обслуживание. 
если пытаться сварганить нечто единое, то получится, что интерпретатору придётся постоянно лишний раз обрабатывать кучу лишнего кода. вот, просто нафига?
если сделать два класса отдельно (как оно сейчас реализовано), то во-первых, тупо душит программерская жаба, наблюдая кучу дублированного кода, а во-вторых, внесение любого изменения в код (сейчас во время разработки) вызывает необходимость проводить теже изменения и в другом блоке. если зазеваешься, в итоге можешь что-нибудь не то удалить


Цитата(solenko @  13.8.2009,  19:33 Найти цитируемый пост)
Это непонятно какие отношения между несвязанными объектами.

а что тут непонятного? по такой системе мы к примеру подключаем разные библиотеки include(), require().
подключаем только то что нам нужно в каждой конкретной ситуации.
PM MAIL WWW   Вверх
youri
Дата 14.8.2009, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bars80080 @  13.8.2009,  09:30 Найти цитируемый пост)
ну хотя бы в том случае, когда у нас для решения задач используются разные классы. и в какой-то отдельной ситуации потребовалось использовать сразу несколько. в дальнейшем приходится передавать ссылку на объект и возникает проблема - приходится передавать ссылки на все объекты. вот и вопрос, почему бы не отнаследовать все нужные классы в один объект?

а что, будет код, который будет использовать поля/методы этого объекта, пришедшие из всех родителей? Т.е. речь идет о наследовании интерфейса, а не реализации?

Цитата(bars80080 @  13.8.2009,  10:48 Найти цитируемый пост)
вот и получается, что приходится делать не универсальные решения, где приходится либо создавать объект из свойства класса:$this->db = new DB();но этот вариант не удобен тем, что зачем запускать ещё раз соединение с БД, если оно уже есть в другом объекте?либо передавать объект с помощью global, что попахивает частным не гибким решением

мне тоже непонятно, зачем запускать еще одно соединение с БД. Можно сделать глобальную точку доступа к объекту БД, можно вообще БД статическим классом сделать. Возможно, имеет смысл почитать Управление зависимостями в PHP-коде

множественное наследование, насколько я знаю, используется для наследования реализации, а не интерфейса. Т.е. у нас есть некоторый класс (F), и мы хотим воспользоваться его функциональностью в классе (A), принадлежащем некоторой иерархии, а делать доступным извне добавленный класс (F) вовсе не нужно. Scott Meyers в Effective C++ (Item 40: Use multiple inheritance judiciously) приводит пример, когда множественное наследование имеет смысл (тоже несколько абстрактный, мог бы привести по-крайней мере пару конкретных примеров, когда он с этим сталкивался). Проблема, описанная мной выше, решается довольно просто - композиция. Так как не нужно менять интерфейс класса A, то мы просто создаем поле в этом классе, в которое помещаем объект класса F и пользуемся этим объектом. Но есть некоторые частные случаи, специфичные для C++. Если мы хотим немного подправить класс F перед использованием, а сделать это можно с помощью наследования (переопределить виртуальные функции), то в этом случае может пригодиться множественное наследование, но мы унаследуемся от класса F так, что никто, кроме класса A этого не заметит (т.е. никто не получит доступа к полям/методам класса F как части класса A). И вот я не могу похвастаться, что сталкивался с необходимостью в множественном наследовании или знаю конкретные случаи, когда оно имеет смысл

а по поводу твоей ситуации, bars80080, я понял следующее. Есть несколько классов, унаследованных от общего класса, которые генерируют страничку или часть ее. И вот в какой-то из этих классов нужно добавить некоторую функциональность из другого класса. Раз ты почему-то до сих пор не объяснил, о каких конкретных классах речь идет, давай строить догадки (потому что говорить абстрактно действительно нету смысла). Есть классы News и Menu, унаследованные от Element. News генерирует список новостей, Menu - меню соответственно. Надо добавить в News функциональность авторизации. Есть два варианта: 1) либо необходимо ее в интерфейс добавить и получим класс NewsAndAuthorization, 2) либо надо просто воспользоваться функциональностью класса Authorization, в результате получим класс EnhancedNews. Жду твоих комментариев ;)
PM   Вверх
nerezus
Дата 14.8.2009, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

разработчики не учли этого момента.
 <sarcasm>Да, конечно, разработчики вообще тупые.</sarcasm>

Конкретно к "примеру выше" посоветую просто учить ООП.
Более конкретно: кроме is-a есть has-a.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
youri
Дата 14.8.2009, 04:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM   Вверх
IZ@TOP
Дата 14.8.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Можно я тоже совет подкину?

Барс, почитай про шаблоны проектирования и MVC в частности.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
bars80080
Дата 14.8.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(youri @  14.8.2009,  01:22 Найти цитируемый пост)
2) либо надо просто воспользоваться функциональностью класса Authorization, в результате получим класс EnhancedNews

ну да, и как отнаследовать в класс EnhancedNews функциональность класса Element и класса Authorization?
PM MAIL WWW   Вверх
IZ@TOP
Дата 14.8.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Цитата(bars80080 @  14.8.2009,  10:57 Найти цитируемый пост)
ну да, и как отнаследовать в класс EnhancedNews функциональность класса Element и класса Authorization? 

Не вижу необходимости наследовать блоку новостей авторизацию. Эта логика должна лежать поверх реализации компонента.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
bars80080
Дата 14.8.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(IZ@TOP @  14.8.2009,  09:55 Найти цитируемый пост)
почитай про шаблоны проектирования и MVC в частности

о шаблонах проектирования не совсем понял. (ведь не имеется же в виду шаблонизация хтмл-а?)
MVC читал. то что читал не понравилось, грубо и топорно, какие-то правила и обязательства. я старался сделать что-то максимально гибкое, где поведение отдельной части (модуля) фактически не зависимо от остальной структуры. сейчас примерно так:

заход на сайт -> переадресация средствами .htaccess на index.php -> разбор урла и определение системы в которую мы входим -> передача управления той системе 
/на данный момент их существует три: лицевая сторона сайта, админская часть, и блок независимых модулей/
каждая система сама определяет как работать дальше и соответственно имеют свои классы, но первые две имеют схожие структуры
-> далее каждая система после выполнения своих обработок передаёт управление на более низко находящиеся уровни, в первых двух блоках полученный результат выполнения идёт в качестве заполнения контента, в третьем блоке управление отдаётся сразу (на то они и независимые)
я не знаю, MVC это или нет, меня эта структура устраивает, я могу переносить разные блоки в разные части сайта средствами интерфейса, могу налагать на них определённые ограничения в доступе и т.д.
PM MAIL WWW   Вверх
IZ@TOP
Дата 14.8.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Цитата(bars80080 @  14.8.2009,  11:13 Найти цитируемый пост)
я старался сделать что-то максимально гибкое

Ну тогда все понятно. Единственное, что могу тебе порекомендовать, посмотреть в сторону шаблона "Декоратор" (он же Wrapper). 


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
perloid
Дата 19.8.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(solenko @ 13.8.2009,  13:49)
perloid, причем тут интерфейсы, которые не могут содержать реализации?

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


Это сообщение отредактировал(а) perloid - 19.8.2009, 09:43
PM MAIL   Вверх
solenko
Дата 19.8.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(perloid @  19.8.2009,  08:42 Найти цитируемый пост)
Притом, что для данной задачи либо используются интерфейсы и абстрактные классы, либо быдлокод с промежуточными классами, поочередно наследующими код базовых.Других решений нет.

1. Тут нет задачи как таковой
2. Использование интерфейсов и абстрактных классов не делают код лучше или хуже сами по себе.
3. Использование интерфейсов и абстрактных классов ничего не меняет в архитектуре и никак не влият на структуру классов

Так что, в данном случае, интерфейс это просто умное слово, примененное не к месту.



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


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



можно взять за основу CI, в итоге получим:
index.php
Код

function load_class( $class, $value = TRUE )
{
    static $objects = array();
         
    if( isset($objects[$class]) AND $value === TRUE )
    {
    return $objects[$class];
    }
    else
    {
     require_once($class.'.php');
                
      $objects[$class] = new $class();            
      return $objects[$class];
    }
}


function get_instance()
{
    return Controller::get_instance();
}


class Controller {

    private static $instance;

    function Controller()
    {    
        //parent::CI_Base();
        $this->_ci_initialize();
    }

    function _ci_initialize()
    {
        $classes = array(
                            'uri'    => 'uri',
                            'cache'        => 'cache',
                            'router'    => 'router'    );
        
        foreach ($classes as $var => $class)
        {
            $this->$var = load_class($class);
        }

    }
    
    public function CI_Base()
    {
        self::$instance = $this;
    }

    public static function get_instance()
    {
        return self::$instance;
    }
}

include 'index2.php';
new Index();



index2.php
Код

class Index extends Controller {
    
    final function __construct()
    {
        parent::Controller();
        echo $this->uri->uri_string();
    }
    
}


больше вариантов не вижу, или их нет, или же опыта мало (кроме использования глобал)


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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