Как вы определяете глобальные переменные?

так как же вы предпочитаете объявлять и использовать глобальные переменные? 1)

global variable;
echo $variable;

or 2)

echo $GLOBALS['variable'];

?

Какой метод менее вреден? :)

редактировать:

or 3)

class myglobalstuff{

  static $instance;

  public static function foo(){
    if(!(self::$instance instanceof self))
      self::$instance = new self();

    return self::$instance;
  }
}
...

?


person Alex    schedule 06.05.2011    source источник
comment
Для внутренних методов класса доступ к свойствам класса? Если это так, я бы сказал, что $this->variable будет намного лучше.   -  person Ry-♦    schedule 06.05.2011


Ответы (7)


Мы предпочитаем вообще не использовать глобальные переменные. И то же самое касается синглтонов и реестров, а также любого другого способа иметь глобальное состояние.

Вам было бы намного лучше, если бы вы научились писать правильный код ООП.


Обновить

Несколько ссылок и сопутствующей информации:

person tereško    schedule 06.05.2011
comment
@Alex: нет, бывают только случаи, когда дизайн вашего приложения ошибочен. Разговоры о чистом коде — глобальное состояние и синглтоны - person tereško; 06.05.2011
comment
Мне было бы очень интересно, если бы вы могли рассказать о правильных методах или дать ссылку на какой-нибудь материал для чтения о правильных методах. - person Jimithus; 06.05.2011
comment
@Brad, какие материалы тебе нужны на самом деле? Если вы хотите знать, чего вам следует избегать в глобальном состоянии, то в коде, тогда в Интернете полно ссылок. Если вам нужны книги, прокрутите вниз до этот ответ , там вы найдете книги, которые я бы порекомендовал (недостаточно места, чтобы поместить их в комментарий) - person tereško; 06.05.2011
comment
@teresko: это видео о java. Я не знаю java :( может быть, это лучше, чем php? В любом случае, единственный способ избежать глобальных переменных в PHP — это передавать параметры как сумасшедший между функциями. Разве это не создает еще больше путаницы, чем использование глобальной переменной? - person Alex; 06.05.2011
comment
@teresko, вы можете отредактировать свой ответ и включить эту ссылку :) Это хороший материал, и я планирую немного его прочитать. Спасибо за ссылку. - person Jimithus; 06.05.2011
comment
@teresko то, что глобальные и синглтоны не в вашем стиле, не означает, что они не одинаково уместны и правильны - это зависит от того, что вам нужно. полный отказ от ООП — самый быстрый способ запустить PHP, но я все же предпочитаю ООП. - person Kelly; 06.05.2011
comment
@Alex: передача параметров лучше. Глобальные переменные генерируют странные зависимости. Возможно, ООП является решением. - person Felix Kling; 06.05.2011
comment
хорошо, но что, если вы в конечном итоге передадите, например, объект $db функции, которая его не использует, но ей нужно передать его дальше функции, которая его использует? выглядит странно... - person Alex; 06.05.2011
comment
@Алекс посмотри это видео. Это не имеет ничего общего с java и все, что связано с дизайном приложений. - person tereško; 06.05.2011
comment
очень интересное видео, но я не совсем понял ответ, который он дал на вопрос около ~32:20. Вам может понадобиться слой db только в начале вашего приложения и в конце, так как вы можете использовать его, не создавая его дважды и не передавая его в качестве параметров всем слоям от начала до конца? - person Alex; 07.05.2011

Использование $GLOBALS менее вредно. Но если можете, избегайте глобальных :)

person Felix Kling    schedule 06.05.2011

Руководство по PHP объясняет, как определять и использовать глобальные переменные: $GLOBAL

person Yuck    schedule 06.05.2011

Ключевое слово global не создает глобальную переменную как таковую, оно просто указывает сценарию обрабатывать переменную с глобальной областью действия.

Массив $GLOBALS на самом деле является суперглобальной переменной, которая немного отличается.

Дополнительная информация здесь, полезно прочитать: http://php.net/manual/en/language.variables.scope.php

person Nick Brunt    schedule 06.05.2011
comment
Как сказал Ник, бессмысленно делать следующее в глобальном коде (код не внутри объявления функции или метода): global $foo; $foo = некоторое значение для всего; $foo является глобальным, потому что он объявлен глобально (а не из-за ключевого слова global). Можно было бы использовать global внутри функции или метода, который должен ссылаться на глобальный $foo (иначе возникнет локальный $foo). - person grantwparks; 07.08.2011

Оставив на минутку в стороне, насколько плохими могут быть глобальные переменные, позвольте мне объяснить это более общей проблемой, которую я заметил: использование ключей строкового массива вместо переменных.

Ввод ключей строкового массива может привести к опечаткам, которые бывает сложно обнаружить: $GLOBALS['var1'] против $GLOBALS['varl'] (один против лямда).

Если у вас есть современная IDE, которая выполняет автозаполнение, вам будет полезно объявить global $variable, а затем, при вводе, вызвать автозаполнение, чтобы получить указание, что вы не сделали опечатку.

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

Если вам нужно использовать глобальные переменные, то использование $GLOBALS может быть лучше для напоминания вам, откуда взялась переменная, когда вы ищете какое-то значение. Однако может оказаться целесообразным хотя бы определить имена переменных как константы, чтобы воспользоваться преимуществами автозаполнения IDE и выделения вхождений: $GLOBALS[_VAR1].

Конечно, эти отличные функции также работают с переменными класса, что является еще одной причиной подумать о рефакторинге :)

person Fanis Hatzidakis    schedule 06.05.2011

Я бы предпочел $_SESSION['var'] $GLOBALS. Он делает примерно то же самое, но безопаснее. Изменить: я хотел сказать более предпочтительный метод. Но $GLOBALS, как говорят, скоро обесценится.

person robx    schedule 06.05.2011
comment
Это не так, и вставлять вещи в сеанс только для того, чтобы сделать их глобальными, - плохая идея, потому что это может иметь неблагоприятные последствия для приложения (поскольку оно сохраняет данные). Если вам ДЕЙСТВИТЕЛЬНО нужны глобальные переменные, я бы поставил их за синглтоном, но я бы предложил передать данные в качестве параметров. - person John Cartwright; 06.05.2011
comment
@John, вы можете очистить сеанс после того, как закончите с ним, запустив session_destroy() и unset(), так что это не так уж плохо, если вы используете его правильно, чтобы перемещать его туда и обратно со страницы на страницу как глобальный. - person robx; 06.05.2011
comment
Согласитесь с Джоном, это довольно нелепое с технической точки зрения предложение, не имеющее личных намерений. - person grantwparks; 07.08.2011
comment
Каждому свое я думаю. Без обид ;) - person robx; 08.08.2011

Кроме того, игнорируя аргумент «без глобальных переменных», я хотел бы сделать четкое различие в использовании «глобальной» декларации, потому что я видел ее неправильное использование повсюду. По крайней мере, в PHP 5 бессмысленно делать следующее в глобальном коде (код не внутри объявления функции или метода):

global $foo;
$foo = "someValueForEverything";

$foo является глобальным, потому что он объявлен глобально (а не из-за ключевого слова «global»). Можно было бы использовать "global" внутри функции или метода, который должен ссылаться на глобальный $foo (иначе возник бы локальный $foo).

person grantwparks    schedule 07.08.2011