Замена глобальных переменных

Привет. Есть Legacy-приложение, в котором вовсю используются глобальные переменные. Для этого приложения пишутся дополнения, как в процедурном, так и в ООП-стиле. В своих ООП-дополнениях для данного приложения я, чтобы не писать в каждом методе класса global $var1, $var2 и т. д., использовал трейт вида:

trait Helpers
{
    public function &__get(string $name)
    {
        return $GLOBALS[$name];
    }
}

Благодаря этому в своих дополнениях я могу использовать конструкцию $this->var1 вместо $var1 и т. д. Помимо очевидных (нужно следить, чтобы в классах не было свойств с такими же именами, как у этих глобальных переменных) какие ещё проблемы могут возникнуть?

Была ещё задумка вместо трейта использовать отдельный класс с тем же магическим методом &__get, но тогда конструкции вида $this->var1 удлинятся ($this->method()->var1 с получением new ClassName из $this->method()), что мне не очень нравится. Попытка использовать паттерн Registry также не увенчалась успехом.

Sarovitsch 01.05.2022 в 18:42

Ответы (1)


Дурацкий вопрос: а чем плохо напрямую, через $GLOBALS ?
Зачем прогонять через магические методы? Из эстетических соображений?

da4nick 06.05.2022 в 10:56

По тем же самым причинам, почему для работы с $_POST, $_GET, $_REQUEST и т. д. используются отдельные классы, вместо использования этих массивов напрямую. Если уж применять ООП, то работать с объектами, а не с глобальными массивами.

Sarovitsch 07.05.2022 в 06:33

Фильтрация входных данных ($_POST, $_GET, $_COOKIE) - понятно.
Но способ решения (ООП или функции или ещё что-то), наверно, всё-таки определяется задачей.

da4nick 13.05.2022 в 10:11

Добавить новый ответ