PHP глобальный или $ GLOBALS - PullRequest
       27

PHP глобальный или $ GLOBALS

42 голосов
/ 26 августа 2010

Есть ли рекомендация / рекомендация, когда я хочу использовать переменную, объявленную вне функции, когда дело доходит до использования:

  1. global $myVar
  2. $GLOBALS['myVar']

Спасибо.

Ответы [ 5 ]

73 голосов
/ 26 августа 2010

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

  1. global потенциально незначительно быстрее (это вряд ли что-то изменит).
  2. $GLOBALS (не $GLOBAL) более читабелен, потому что каждый раз, когда вы его видите, вы знаете, что получаете доступ / изменяете глобальную переменную. Это может помочь избежать неприятных ошибок.
  3. Внутри функции, если вы хотите удалить глобальную переменную, вы должны использовать unset($GLOBALS['varname']), а не global $varname; unset($varname);.

Что касается пунктов 1 и 2, я процитирую Сара Големона здесь:

Что это значит для вашего использования массива $GLOBALS? Это верно, ключевое слово global технически быстрее. Теперь я хочу быть действительно ясным об одной вещи здесь. Незначительную скорость, предоставляемую использованием глобальных переменных в качестве локализованных [скомпилированных переменных], необходимо серьезно сопоставить с возможностью сопровождения просмотра вашего кода через пять лет и знания того, что $foo пришло из глобальной области. something_using($GLOBALS['foo']); ВСЕГДА будет понятнее для вас, чем global $foo; /* buncha code */ something_using($foo); Не будьте мудрыми и глупыми.

31 голосов
/ 26 августа 2010

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

Пример того, как изменить переменную вне функции, передав ее в качестве ссылочного параметра:

function myFunc(&$myVar)
{
    $myVar = 10;
}

$foo = 0;
myFunc($foo);
var_dump($foo); // yields 10
3 голосов
/ 26 августа 2010

Я бы сказал, что не рекомендуется использовать Globals в ООП, всегда должен быть лучший способ

3 голосов
/ 26 августа 2010

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

0 голосов
/ 26 августа 2010

global $var; эквивалентно $var =& $GLOBALS['var'].

Некоторые люди полагают, что это быстрее, чем использование $GLOBALS, однако это не всегда так.Если вы используете переменную только один раз, $GLOBALS будет быстрее, потому что вы не будете тратить время на присваивание.

Однако, если вы используете переменную несколько раз, используя global (или эквивалентныйназначение) быстрее, потому что искать в массиве ключ var только один раз.

Вот и все о скорости.Тем не менее, разница в скорости действительно мала, и читаемость важнее.Тем не менее, разные люди имеют разные предпочтения в отношении читабельности - я предпочитаю global, другие люди, отвечающие здесь, предпочитают $GLOBALS, поэтому вам решать, что лучше выглядит.

...