Есть ли лучшая практика/рекомендация, когда я хочу использовать переменную, объявленную вне функции, когда речь заходит об использовании:
global $myVar
$GLOBALS['myVar']
Спасибо.
Есть ли лучшая практика/рекомендация, когда я хочу использовать переменную, объявленную вне функции, когда речь заходит об использовании:
global $myVar
$GLOBALS['myVar']
Спасибо.
Что вы действительно должны сделать, это передать переменную функции вместо использования глобального.
Пример, как изменить переменную вне функции с помощью передачи его в качестве опорного параметра:
function myFunc(&$myVar)
{
$myVar = 10;
}
$foo = 0;
myFunc($foo);
var_dump($foo); // yields 10
Я бы пошел глобальным в верхней части вашей функции. Таким образом, вы можете легко увидеть, какие глобальные переменные используются.
За исключением случаев, когда функция длинна (например, большой оператор switch), и теперь вы не знаете, что такое глобальное, а что нет. Вы можете объявить, какие глобальные переменные вы используете с phpdoc ('@ global'). – Artefacto
Я пустошь сказать, что это не рекомендуется использовать Globals в ООП, всегда должно быть лучше
Ну, вы должны использовать только глобалам в ограниченных условиях, но ответить на ваш вопрос:
global
потенциально немного быстрее (это Rar а также изменить ситуацию).$GLOBALS
(не $GLOBAL
) является более читаемым, потому что каждый раз, когда вы его видите, вы знаете, что вы обращаетесь к/изменяете глобальную переменную. Это может сыграть решающую роль в предотвращении неприятных ошибок.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);
Не быть мелочный и фунт глупо ..
global $var;
эквивалентно $var =& $GLOBALS['var']
.
Некоторые люди предположили, что это быстрее, чем использование $GLOBALS
, однако это не обязательно так. Если вы используете переменную только один раз, то $GLOBALS
будет быстрее, потому что вы не будете тратить время на уступку.
Однако, если вы используете переменную несколько раз, использование global
(или эквивалентное назначение) выполняется быстрее, потому что поиск массива для ключа var
только один раз.
Это все о скорости. Однако разница в скорости очень мала, и читаемость важнее.Тем не менее, разные люди имеют разные предпочтения в отношении удобочитаемости - я предпочитаю global
, некоторые другие люди, отвечающие здесь, предпочитают $GLOBALS
, так что решать вам, что будет выглядеть лучше.
Ваши первые два абзаца ошибочны. Ну, первое - это неправильно. Это семантически эквивалентно, но они не переводятся на одни и те же коды операций, а 'global $ var' быстрее, чем' $ var = & $ GLOBALS ['var'] '.Второй абзац просто неверен. – Artefacto
@Artefacto: Хм, я думал, что они действительно эквивалентны. Спасибо, что указали, что я попытаюсь найти дополнительную информацию об этом. – Mewp
Что касается хорошо, второе неверно, запустите «Код профиля» на этом http://codepad.viper-7.com/roRI8g. Вы увидите, что 'global' - это всего лишь один хэш-поиск и хранение в скомпилированной переменной. Вариант '$ GLOBALS' влечет за собой два хэш-поиска. Он не хранится ни в одной переменной, но это не имеет никакого значения в сравнении с хранением в скомпилированной переменной, с точки зрения производительности. – Artefacto
Мне нужно отредактировать внешнюю переменную. – Francisc
@Francisc Если вы действительно этого хотите, вы можете передать его по ссылке. – Artefacto
Я приложил пример, чтобы продемонстрировать использование ссылки, например, предложенной Artefacto. –