Какой интерфейс ReadOnly настроек выбрать?

Есть объект класса Settings, ссылка на который запрашивается через Registry::getSettings() в конструкторах моих классов. В этом объекте хранятся значения глобальных настроек сайта. Их изменение в процессе работы скриптов не требуется, и даже нежелательно, то есть надо организовать к значениям доступ ReadOnly.
Вопрос - как правильно запрашивать настройки в коде классов, чтобы максимально абстрагироваться от специфики моего способа предоставления настроек?

Итак, в конструкторах классов ссылка на объект класса Settings сохраняется в свойстве $config. Варианты доступа к значениям настроек (внутри методов класса):

1. $this->config['parameter']
2. $this->config->parameter (в классе Settings я магическим методом читаю значения, а запись запрещаю)
3. $this->config->getParameter()
4. $this->config->get('parameter')

Какой из интерфейсов наиболее адекватный и общепринятый? Так как обращаться я к настройкам буду часто, потом не хочется всё заново переписывать или иметь код, который не смогут нормально использовать другие люди.
  • Вопрос задан
  • 197 просмотров
Пригласить эксперта
Ответы на вопрос 2
nazarpc
@nazarpc
Open Source enthusiast
Мне нравятся 2 и 4, при чем если параметров конечное число вы можете в 2 добавить ещё PhpDoc секции в $this->config, тогда даже подсказки в IDE получите, я у себя обычно делаю оба, кому как удобно.
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
То, что вы ищите обычно называют не мутабельными моделями.

Все настройки задаются в конструкторе, там же они валидируются и присваиваются приватным свойствам. Сеттеров нет, только геттеры (вариант 3).

Конкретно для настроек имеет смысл создать класс с константами, например в таком виде:

config/AbstractConstant.php - общие настройки для всей системы И настройками "по умолчанию".
config/Constant.php (Наследует AbstractConstant) - это класс содержит настройки для текущего окружения.

В итоге в любой части системы вы получите доступ к настройкам примерно так:
\Contant::MYSQL_USER
Ответ написан
Ваш ответ на вопрос

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

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