Каков наиболее эффективный способ обработки глобальных переменных в PHP?

Кажется, что некоторые люди ненавидят глобальные переменные, но если вы можете объяснить, как писать код без них, я все слышу.

В противном случае у меня есть несколько вариантов, и мне любопытно, какой из них лучше всего в долгосрочной перспективе. Учтите, что у меня есть переменная, которая не будет меняться в течение всего времени. Это статический глобал. Я могу использовать:

$_SESSION['var'] = constantval;
define('var', constantval);
var = constantval;

и тот, который мне действительно любопытен:

function my_constants($which)
{
    switch ($which) {
        case 'var':
            return 'constantval';
    }
}

В последнем случае цель состоит в том, чтобы сохранить переменную вне глобальной области видимости, чтобы сэкономить память за счет некоторой стоимости процессора. Стоит ли экономить память циклов? Есть ли заметная разница между различными другими типами глобального объявления?


person not_a_generic_user    schedule 09.01.2014    source источник
comment
Пожалуйста, приведите пример своего утверждения, если вы можете объяснить, как писать код без них ... вам нужно сказать мне, ПОЧЕМУ использовать глобальные переменные.   -  person Goikiu    schedule 09.01.2014
comment
Этот вопрос полон красных сельдей, самая большая из которых: если вы можете жестко запрограммировать значение var, то как именно это будет переменной?   -  person Jon    schedule 09.01.2014
comment
переменные! = константы   -  person Salman A    schedule 09.01.2014
comment
Знак $ перед словом var был ошибкой. Я починил это.   -  person not_a_generic_user    schedule 09.01.2014
comment
Гойкиу, как у вас есть абстрактное значение вместо того, чтобы жестко кодировать его во всех файлах и функциях без глобальных переменных? Как показывает мой пример, у меня есть постоянное значение, и оно мне нужно во многих разных местах. Как это сделать без глобальных варов?   -  person not_a_generic_user    schedule 09.01.2014
comment
Вы должны использовать определение для постоянных значений. Не только из соображений удобочитаемости. Использование определения для констант - это проектная инструкция, которая гласит: это значение не должно изменяться приложением. Внутренняя обработка констант во многих аспектах отличается от переменных. Их можно перевести на ранней стадии парсинга скрипта. Помните, что скрипт PHP сначала транслируется в его AST, затем в IR, прежде чем он наконец будет скомпилирован. Поскольку PHP-интерпретатор является трехсторонним компилятором, при выполнении этих трех этапов синтаксического анализа происходит много вещей.   -  person Peter    schedule 09.01.2014
comment
Например. Операторы будут преобразованы: echo This is {$ someVar} будет преобразовано в echo This is; echo $ someVar. константы заменяются их значениями. Это не относится к переменным.   -  person Peter    schedule 09.01.2014


Ответы (2)


Глобальные переменные не считаются плохой практикой из-за использования памяти или стоимости процессора. Это из-за проблем, которые может вызвать изменение любой части вашей программы. Со временем становится трудно понять, какие части программы читают или записывают в ваши глобальные переменные.

person Guilherme Sehn    schedule 09.01.2014
comment
Хотя это может быть, я действительно не понимаю, как вы можете обойти это для констант, таких как пример, который я привел. Я открыт для других идей, но если у меня есть постоянное значение, такое как путь к моим графическим файлам или максимальное разрешенное количество виджетов, где еще я мог бы разместить эту информацию, чтобы она не была жестко закодирована? - person not_a_generic_user; 09.01.2014
comment
Что ж, вы можете без проблем использовать константы. В отличие от переменных, они неизменяемы, и другие части вашего приложения не смогут их изменить. Чтобы не загрязнять пространство глобальных констант, я думаю, было бы целесообразно использовать константы классов, как предложил Артефакто в своем ответе на этот вопрос: stackoverflow.com/questions/6736330/ - person Guilherme Sehn; 09.01.2014
comment
Так что краткое пояснение, если можно: единственное функциональное различие между глобальными переменными и константами - чистота стандартов? IE, это делает людей более комфортными, но в противном случае они не ведут себя по-другому? - person not_a_generic_user; 09.01.2014
comment
См. Мой комментарий, связанный с PHP - трехсторонний синтаксический анализ выше. - person Peter; 09.01.2014
comment
@not_a_generic_user разница между константами и глобальными переменными заключается в том, что константы не изменяемы, поэтому вы не можете изменить их значение после того, как оно будет установлено впервые. Сегодня вы наверняка знаете, что не будете изменять глобальную переменную, которая предназначена для хранения постоянной информации в вашем коде, но вы должны учитывать, что когда-нибудь другие люди могут выполнять обслуживание этого кода, или вы можете забыть об этом в будущее, и принятие правильных дизайнерских решений на этом этапе сделает ваш код менее хрупким. - person Guilherme Sehn; 09.01.2014
comment
@GuilhermeSehn, очень хорошее замечание. На самом деле причина, по которой люди ненавидят глобальные переменные, заключается в том, что вы должны использовать константы (по крайней мере, для значений, которые не меняются) - person not_a_generic_user; 10.01.2014
comment
Я пометил ваш как ответ, но хочу указать на этот другой вопрос о stackoverflow, который дал очень хорошую информацию о разнице между const и define: stackoverflow.com/questions/2447791/define-vs-const - person not_a_generic_user; 10.01.2014

Альтернативы глобалам (сингтонам). Это даст вам детальный контроль доступа: например:

 class ConfigParamSingelton {
     private var $value;
     private static $mInstance = null;

     public function getValue() { 
         return $this->value;
     }

     public function getInstance() {
         if(self::$mInstance == null) {
            self::$mInstance = new ConfigParamSingelton();
         }
         return self::$mInstance;
     }

Итак, теперь вы можете:

     protected function setValue($val) { // is immuteable by clients of the object
          $this->value = $val;
     }

or

     public function setValue($val) {// is muteable
          $this->value = $val;
     }

Ну это одиночки. В этом случае вам не нужны глобальные переменные.

person Peter    schedule 09.01.2014
comment
Хотя Singeltons также считается плохой практикой. Поэтому Symfony2 предоставляет CDI - Контейнер. - person Peter; 09.01.2014