Хорошая идея или плохая идея?Использование переменной статического класса для хранения глобального - PullRequest
2 голосов
/ 17 сентября 2010

У меня есть класс, который я использую повсюду в моем коде. Он содержит настройки и другие основные функции. Вот что я сейчас делаю, чтобы использовать класс.

$settings = new Settings();
$settings->loadSettings();

Затем, когда мне нужно кодировать какую-то случайную функцию в другом классе, я делаю что-то вроде этого:

function abc() {
    global $settings;
    $variable = $settings->a;
}

Я устал от случайного вызова глобальных настроек $ повсюду, чтобы получить этот объект настроек. Я не хочу использовать массив $ _GLOBALS (я не знаю почему, я просто не хочу).

Я думаю, что хочу переключиться на статическую переменную класса с именем $ settings внутри настроек. Код будет выглядеть так:

Settings::$settings = new Settings();
Settings::$settings->loadSettings();

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

function abc() {
    $variable = Settings::$settings->a;
}

Хорошая идея или плохая идея?

Ответы [ 2 ]

8 голосов
/ 17 сентября 2010

Что ж, это, вероятно, улучшение для глобалов, потому что оно решает все уродливые проблемы с областями видимости, которые вызывают глобалы. Избавиться от глобального оператора, как правило, хорошо! То, что вы делаете, не отличается от шаблона синглтона, хотя это значительно проще. (См. Раздел «Синглтон» на http://php.net/manual/en/language.oop5.patterns.php для получения дополнительной информации о шаблоне.) Ваше решение почти наверняка подойдет для ваших целей.

С другой стороны, могут быть более эффективные способы достижения того же, что еще больше разъединяет ваш код. То есть каждый класс становится более пригодным для использования в другом проекте без существенной перекодировки. Один из способов сделать это - «вставить» объект настроек в каждый класс:

class ABC {
    private $settings;

    public function __construct($settings) {
        $this->settings = $settings;
    }

    public function someMethod() {
        $variable = $this->settings->a;
    }
}

Это будет больше работы, но может улучшить возможность повторного использования вашего кода. Затем вы можете, например, написать разные классы настроек для каждого проекта, но использовать один и тот же класс ABC.

Этот процесс, где вы «внедряете» объект в другой объект, который зависит от него, называется внедрением зависимости. Есть и другие, более сложные способы сделать это, включая сложные контейнеры. См. http://fabien.potencier.org/article/11/what-is-dependency-injection для интересного набора учебников по этому вопросу. Они, вероятно, имеют отношение к вашим текущим потребностям, но могут помочь либо сейчас, либо в будущем.

1 голос
/ 17 сентября 2010

Кажется, вы ищете Singleton . По сути, идея состоит в том, чтобы иметь класс с открытым статическим методом getInstance (), который возвращает экземпляр самого класса. При первом вызове метода он сохраняет экземпляр в частном свойстве, а все последующее время возвращает сохраненный экземпляр. Таким образом, всякий раз, когда вы вызываете Settings :: getInstance (), вы гарантированно получаете копию того же объекта. Тогда вы можете сохранить настройки в этом объекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...