2010-08-26 3 views
36

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

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

Спасибо.

ответ

33

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

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

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

$foo = 0; 
myFunc($foo); 
var_dump($foo); // yields 10 
+3

Мне нужно отредактировать внешнюю переменную. – Francisc

+1

@Francisc Если вы действительно этого хотите, вы можете передать его по ссылке. – Artefacto

+1

Я приложил пример, чтобы продемонстрировать использование ссылки, например, предложенной Artefacto. –

3

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

+2

За исключением случаев, когда функция длинна (например, большой оператор switch), и теперь вы не знаете, что такое глобальное, а что нет. Вы можете объявить, какие глобальные переменные вы используете с phpdoc ('@ global'). – Artefacto

3

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

69

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

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

Как пунктов 1 и 2, я quote Сара Golemon здесь:

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

+3

Очень полезно, спасибо. – Francisc

+1

Я согласен с вами, $ GLOBALS намного лучше, чем «глобальный» – Stef

+11

+1 для ответа на вопрос, который был задан. Глобалы могут быть не лучшими практиками, но иногда нам приходится работать с ними (WordPress, кто-нибудь?). – Mark

0

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

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

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

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

+0

Ваши первые два абзаца ошибочны. Ну, первое - это неправильно. Это семантически эквивалентно, но они не переводятся на одни и те же коды операций, а 'global $ var' быстрее, чем' $ var = & $ GLOBALS ['var'] '.Второй абзац просто неверен. – Artefacto

+0

@Artefacto: Хм, я думал, что они действительно эквивалентны. Спасибо, что указали, что я попытаюсь найти дополнительную информацию об этом. – Mewp

+1

Что касается хорошо, второе неверно, запустите «Код профиля» на этом http://codepad.viper-7.com/roRI8g. Вы увидите, что 'global' - это всего лишь один хэш-поиск и хранение в скомпилированной переменной. Вариант '$ GLOBALS' влечет за собой два хэш-поиска. Он не хранится ни в одной переменной, но это не имеет никакого значения в сравнении с хранением в скомпилированной переменной, с точки зрения производительности. – Artefacto

Смежные вопросы