Создание хорошего класса реестра в PHP для важных классов - PullRequest
3 голосов
/ 13 сентября 2010

У меня есть веб-приложение, где я использую класс реестра.Класс реестра содержит важные классы, которые мне нужны во всем приложении.

Я сделал класс реестра классом Singleton, и этот класс является статическим.

Содержимое класса реестра находится здесь:

<?php
class registry
{
    private static $objects = array();
    private static $instance;

    private function __construct(){}
    private function __clone(){}

    public static function singleton()
    {
        if( !isset( self::$instance ) )
        {
            self::$instance = new registry();
        }
        return self::$instance;
    }

    public function storeObjects()
    {
        $Objects = array_merge($GLOBALS['EXTRA_LIBS'],array('data','page','session','uri','loader','modules'));

        foreach($Objects as $name)
        {
            $this->$name  = $name;
        }
    }

    public function __set( $object, $key )
    {
        require_once(__LIBRARIES . DS . $object . '.class.php');
        self::$objects[ $key ] = new $object( self::$instance );
    }

    public function __get( $key )
    {
        if( is_object ( self::$objects[ $key ] ) )
        {
            return self::$objects[ $key ];
        }
    }

    public function returnAllObjects()
    {
        return self::$objects;
    }
}
?>

Теперь, когда я хочу использовать один из классов здесь, в моем приложении, я делаю:

registry::singleton()->data->adddata('somedata');

Я часто использую классы в своем приложении, минимум 1 раз в каждомметод.

Теперь мой вопрос: что лучше всего сделать:

1) вызывать все это каждый раз

2) Класс $registry = registry::singleton(); один раз в каждом методеа затем просто используйте локальную переменную.(Я не знаю, сработает ли это)

Или есть более элегантный способ решения этой проблемы.

Ответы [ 2 ]

3 голосов
/ 13 сентября 2010

Независимо от того, назначаете ли вы экземпляр реестра локальной переменной или нет, это не имеет значения. Если это ваша единственная задача, используйте то, что делает код более читабельным в конкретном блоке кода.

Я бы больше беспокоился о последствиях необходимости жестко закодировать имя класса Registry в другие мои классы и о том, действительно ли мне нужен Singleton для реестра. Взгляните на Внедрение зависимостей .

0 голосов
/ 13 сентября 2010

(2) будет работать нормально, попробуйте.Если вы будете использовать его несколько раз в каждом методе, это сэкономит вам немного времени при наборе текста.

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

...