Задать вопрос

Использование реестра через wrapper без синглтона в PHP?

Насколько уместно использование подобной конструкции для использования реестра:

$___REGISTER = (object) array(); // Создаем StdClass для работы с массивом как с объектом

function &Reg()
{
    return $GLOBALS['___REGISTER'];
}

// Применение

Reg()->config = (object) array();
Reg()->config->host = 'habrahabr.ru';
Reg()->config->admin = 'admin@habrahabr.ru';
Reg()->config->name = 'Хабрахабр';

// ... и т.д. и т.п.



Использую для замены:
Register::set('config', array(/*... */));
$config = Register::get('config');



Какие подводные камни могут быть при использовании такой обертки? Использовали бы вы такой враппер в своих проектах? Где его 100% не нужно использовать?
  • Вопрос задан
  • 2487 просмотров
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
den1n
@den1n
Не использовал бы, т.к. глобальную переменную $___REGISTER можно случайно или намеренно изменить, а потом искать, где «собака порылась».
Если очень хочется использовать stdClass в качестве контейнера в реестре, то я бы предложил поступить так:
class Registry extends stdClass {
    private static $instance;

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

    public static function me ()
    {
        if (self::$instance === null)
            self::$instance = new self;
        return self::$instance;
    }
}

# Использовать так
Registry::me()->config = new stdClass;
Registry::me()->config->host = 'habrahabr.ru';
Registry::me()->config->admin = 'admin@habrahabr.ru';
Registry::me()->config->name = 'Хабрахабр';
Ответ написан
LoneCat
@LoneCat
Вы вполне можете использовать наследие процедурного php для этих целей, а именно — объявление статической переменной функции.

function Reg() {
  static $registry = null;
  if(null === $registry) {
    $registry = new stdClass;
  }
  return $registry;
}
Ответ написан
conf
@conf
Ruby developer
Если вы планируете тестировать собственный код (в смысле автоматизированно, например, с помощью PHPUnit), не используйте синглтоны, не говоря уже о глобальных переменных (которые вы привели в пример). Почитайте что такое тестируемый дизайн и принцип Dependency Injection. Если вы читаете по-английски, рекомендую вот эту ссылку misko.hevery.com/code-reviewers-guide/ и презентацию
www.procata.com/talks/phptek-may2007-dependency.pdf
Вот здесь есть описание компонентов Symfony в переводе на русский: madbee.ukr.su/solenko/dependency-injection/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы