@aandreevich

PHP Abstract Registry или методы __set() and __get(), как лучше реализовать глобальную переменную?

Здравствуйте. Хочу иметь одну глобальную переменную, чтобы была возможность работать и в контроллере, и в отображении, и в модели. Есть код:

namespace CORE{
    class Registry{
        private static $data = array();
        function __set($key,$value){
            self::$data[$key] = $value;
        }
        function __get($key){
            return self::$data[$key];
        }
        function __construct(){

        }

    }
}

Сделав объявление в любом скрипте:

use CORE\Registry;
$registry = new Registry();

Могу использовать:

$registry->name = 1;
echo $registry->name;

Но при этом получается, что каждый раз я создаю новый объект, хоть и массив $data и остается неизменным. Насколько это плохо? Думал сделать класс абстрактным, чтобы не создавать новый объект, но тогда методы __set и __get использовать не получится, и тогда придется использовать конструкции вида:

Registry::set($key,$val);
Что не очень удобно по сравнению с:

$date->name;
Какой вариант предпочтительнее? Страшно ли объявление как в первом варианте? Или как лучше поступить?
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Какой вариант предпочтительнее? Страшно ли объявление как в первом варианте? Или как лучше поступить?


Настоятельно рекомендую вам отказаться от идеи использования глобальных переменных. Оно вам не нужно.

1) контроллер не должен иметь состояния
2) view так же не должно иметь состояние, ему на вход приходят данные и оно его тупо рисует.
3) модель - единственное что может иметь состояние, но если что это не один объект, это целый граф объектов. Сущности, сервисы и объекты-значения.

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

Затем мы это состояние из контроллера скармливаем в шаблонизатор какой и получаем view. Замечу что view в контексте вопроса это просто пассивное отображение данных на HTTP.

Вывод - глобальное состояние не нужно.
Ответ написан
@shagguboy
Singleton бери.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы