Один базовый класс для всех объектов?

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Один базовый класс для всех объектов?

Не могу определиться со следующей конструкцией, является ли она хорошей или не очень, в чем могут быть подвохи?
PHP:
class Base
{
static protected $_dbObject;
static protected $_policyObject;
//... и т.д.
// объекты, для простоты, инициализируются в конструкторе
}

class A extends Base
{
public function fooA1()
{
 $this->dbObject->execute(...);
}
public function fooA2()
{
 return $this->policyObject->IsAllow(...);
}
}

class B extends Base
{
public function fooB()
{
 $this->dbObject->execute(...);
}
}
На пальцах, идея проста, есть базовый класс, который является родителем (Base), для всех объектов, через статические свойства, можно получить доступ к созданным общим объектам. Не помню, где-то в какой-то книжке читал, что данная конструкция не очень подходит для php.

Прокомментируйте пожалуйста.
 

HraKK

Мудак
Команда форума
Она не подходит под все ЯП.
Для доступа к звездным обьектам используйте Singleton
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
этот паттерн я использую, только в извращенном виде вот примерно, то как я это использую

PHP:
public function &__get($m)
    {
        switch(strtolower($m))
        {
            case 'config':
                if(self::$__config == NULL)
                    self::$__config = new Collection;
                return self::$__config;    
            break;
            case 'policy':
                if(self::$__policy == NULL)
                    self::$__policy = new CPolicy;
                return self::$__policy;    
            break;
            case 'registry':
                if(self::$__registry == NULL)
                    self::$__registry = CRegistry::Instance();
                return self::$__registry;
....
*звездные объекты - интересное словосочетание :)
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: HraKK
В пхп 5 все обьекты и так передаются по ссылке
Эт понятно, просто привычка, явно видеть, то, что скрывается за особенностями реализации, да и другим при поверхностном анализе, будет понятней.

Вопрос в подходе, один базовый класс со статическими свойствами, это зло или неплохое решение?
 

iSlayter

Новичок
HraKK, то есть грамотнее не держать в Registry ссылки на звёздные объекты, а использовать для них Singleton?

(интересуюсь, т.к. у меня в Registry лежат config и view)

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

Ирокез

бессмертный пони
Команда форума
Партнер клуба
john.brown
а чем плох, тот-же синглтон но в рамках $this->db->execute()?
 

john.brown

просто кулибин
Тем, что усложняет простую вещч без объективной на то надобности. Обясни, плз, чем вызвано желание делать самодостаточный класс базы данных зависимым от какого то мистического базового класса? И кто, когда то потом, посмотрев на класс Db догадается, что он синглтон?

п.с. меня тоже когда то давно посещала подобная гениальная идея. ничего, кроме путаницы, она не дала... :)
 

kirill538

Новичок
ИМХО, глобальный базовый класс - глупость, а переживают о недостатках ее реализации в php любители множественного наследования :)

-~{}~ 13.06.08 20:20:

Автор оригинала: iSlayter
HraKK, то есть грамотнее не держать в Registry ссылки на звёздные объекты, а использовать для них Singleton?
Registry абсолютно правильное решение. Делать каждый звездный объект синглтоном гораздо хуже. Вы привязываетесь к имени класса и лишаете себя возможности его простой замены (что через регистри делается вполпинка). Вот сам Registry может быть синглтоном, хотя это тоже некоторые грабли ...
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: john.brown
Обясни, плз, чем вызвано желание делать самодостаточный класс базы данных зависимым от какого то мистического базового класса? И кто, когда то потом, посмотрев на класс Db догадается, что он синглтон?
Ну в принципе он не зависит от базового. database он и есть синглтон, но он проецируется в общий базовый класс, т.е. справедливо как Database::instance(), так и в рамках, дочернего класса, $this->database. Что это дает хм, кроме красивости (по моему мнению) кода, наверно больше ничего.


Автор оригинала: john.brown
п.с. меня тоже когда то давно посещала подобная гениальная идея. ничего, кроме путаницы, она не дала... :)
Радует, что ни я один такой :)

Автор оригинала: kirill538
а переживают о недостатках ее реализации в php любители множественного наследования
а чем плохо наследование в php?

Автор оригинала: kirill538
ИМХО, глобальный базовый класс - глупость
Ну если посмотреть в сторону MFC от Microsoft то там CObject таков и есть.
 

HraKK

Мудак
Команда форума
kirill538
Registry и Singleton 2 совершенно разных патерна решающие 2 разные проблемы, просто многие не допоняв и в силу легкости использования используют Синглетон как замена Registry.
 

Sluggard

Новичок
kirill538
Вы привязываетесь к имени класса и лишаете себя возможности его простой замены (что через регистри делается вполпинка).
В случае с Singleton, делается так же в пол пинка.

HraKK
просто многие не допоняв и в силу легкости использования используют Синглетон как замена Registry.
Для понимания Registry необходимо иметь семь пядей во лбу?

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

Ирокез
На пальцах, идея проста, есть базовый класс, который является родителем (Base), для всех объектов, через статические свойства, можно получить доступ к созданным общим объектам.
А нужно ли это ВСЕМ объкетам? Исходи из принципа: Каждый класс должен максимально не знать о существовании и/или реализациях других классов.
 

HraKK

Мудак
Команда форума
Sluggard
многие не допоняв и в силу легкости использования используют Синглетон
Причем тут регист? Я говорю что синглетон используют как регистр
 

kirill538

Новичок
а чем плохо наследование в php?
Плохо множественное наследование, а в php как раз все в порядке :)

Sluggard
В случае с Singleton, делается так же в пол пинка.
Пример можно ? Как подменить инстанс синглетона в коде класса N, не меняя в классе N ни строчки кода.

-~{}~ 14.06.08 13:42:

HraKK
Registry и Singleton 2 совершенно разных патерна решающие 2 разные проблемы
Вы считаете, что смешивание паттернов невозможно и класс Registry не может быть одновременно Singletone ?
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Спасибо, за советы, вроде определился, наследование в вышепреведенном контексте - зло :).

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

Велосипед???
 

kirill538

Новичок
Ирокез
А любой паттерн велосипед по определению :) Только гарантированно хороший велосипед, при использовании по назначению.

Звездные объекты, которые удобно хранить в реестре, и должны быть в единственном экземпляре. Но ниоткуда не следует, что для них надо использовать паттерн Singletone. Если вы обращаетесь к ним исключительно через объект рееста - там и обеспечиваете единственность инстанса, все правильно. А передача в реестр имени класса вместо объекта - тоже правильно, lazy instance. Сам реестр можно сделать синглтоном, но это уже дело вкуса (см тему про push/pull подходы на agiledev)
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
kirill538
Спасибо, наверно, это самый подходящий вариант.

Спасибо, всем, за советы и ответы.
 

HraKK

Мудак
Команда форума
kirill538
Вы считаете, что смешивание паттернов невозможно и класс Registry не может быть одновременно Singletone ?
Руль и пласмаса разные вещи. Что руль не может быть из пласмасы?
Если вы обращаетесь к ним исключительно через объект рееста - там и обеспечиваете единственность инстанса
Короче клинический случай. Селяви.
 
Сверху