2009-07-26 2 views
1

Я уже давно работаю над своими собственными небольшими рамками для своей собственной выгоды, постоянно возвращаюсь к коду, когда изучаю новые вещи. Как и следовало ожидать, у меня есть объект реестра, который используется почти всеми другими объектами.Каков наиболее эффективный способ взаимодействия с Singleton?

В настоящее время, самый основной объект (AFObject) устанавливается немного как этот

absract class AFObject { 

    var $_registry; 

    function __construct(){ 
     $this->_registry = AFRegistry::getInstance(); 
    } 

} 

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

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::$foo = $bar; 
    } 

} 
+2

вы должны использовать public, protected или private вместо ключевого слова var в php 5. –

ответ

0

Я не думаю, что вы должны думать об эффективности в этом случае (так как 100 ссылок на самом деле это не проблема , и это немного преждевременная оптимизация). Но рассмотрите, что является самым элегантным в вашем коде. Также подумайте, нужен ли вам один сингл (может ли он быть реализован как статический класс?). Я бы предпочел использовать ваш второй случай, так как это делает ваш код немного более очевидным (по крайней мере, я так думаю).

В этом случае было бы

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::getInstance()->$foo = $bar; 
    } 

} 

Или, если вы инкапсулировать свойство:

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::getInstance()->setFoo($bar); 
    } 

} 
2

На мой взгляд, "реестра" типа классов вида smells.

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

Я оставил бы из варианта 1 (абстрактный базовый класс), потому что тогда все ваши классы становится зависимым от некоторых других классов ...

Использование статического класса как Yngve Sneen упомянул бы быть лучшим подходом в моем если вы хотите сохранить настройку реестра.

Нечто вроде: registry :: set ('var1', $ var1); $ var1 = registry :: get ('var1');

1

Рассмотрит это:

class AFRouter extends AFObject { 
    function someMethod($bar) { 
    global $af_registry; 
    $af_registry->setFoo($bar); 
    } 
} 

или даже:

class AFRouter extends AFObject { 
    function someMethod($bar) { 
    af_registry_set('foo', $bar); 
    } 
} 

Бар синтаксис, нет по существу никакой разницы между этим и текущим решением.

Да, это означает, что ваш реестр по существу является глобальной переменной. И да, есть проблемы с глобальными переменными. Лучшим вариантом будет pass in the dependencies.

Смежные вопросы