#php
В интернете видел что пишут разница лишь в написании, так ли это? Снизу товарищ Saidolim написал один пример, хочу продолжить вопрос... Есть такой код /// Пример 1 $str = "Simple text"; $a = function() { global $str; $str = "edited"; }; $a(); echo $str."\n"; /// edited /// Пример 2 $str = "Simple text"; $a = function() { $GLOBALS["str"] = "edited"; }; $a(); echo $str."\n"; /// edited /// Пример 3 $str = "Simple text"; $temp = ""; $a = function() { $GLOBALS["temp"] = &$GLOBALS["str"]; }; $a(); echo "[".$str."] [".$temp."]\n"; /// [Simple text] [Simple text] /// Пример 4 $str = "Simple text"; $temp = ""; $a = function() { global $str, $temp; $temp = &$str; }; $a(); echo "[".$str."] [".$temp."]\n"; /// [Simple text] [] Первый пример выводит как и ожидается измененное значение, второй пример то же самое...казалось бы отличия нет, идем дальше! В третьем примере в функции мы делаем жесткую ссылку для элементов суперглобального массива выводит как и ожидается одно и то же слово, и вот смотрим четвертый пример и ... я в ступоре он не линкует и выводит только переменнную $str, а переменную $temp оставляет пустой, почему? P.S Написал тут ибо не хотел спамить вопросами по одному и тому же
Ответы
Ответ 1
Инструкция global обращается к глобальному массиву $GLOBALS. И получает значение переменной $GLOBALS['var']. Отличие только в написании. P.S. Совет при использовании глобальных переменных: держитесь от них подальше, используя их только тогда, когда без них не обойтись. Злоупотребление глобальными переменными может довести человека анализирующего ваш код до белой горячки.Ответ 2
Обратимся к документации(это, кстати, очень полезно делать) $GLOBALS — Ссылки на все переменные глобальной области видимости Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции. Фактически, они предоставляют доступ к одним и тем же объектам. Разница только в способе использования. И как верно заметил @Firepro, использование global либо $GLOBALS - это очень плохо.Ответ 3
global думаю работает быстрее. Так как подход другой. Но когда используете переменную, вам трудно понять она глобальная или нет. $GLOBALS более читальный и легко понять. Так как очевидно выдно что переменная глобальная. Если в функции хотите использовать unset глобального переменного, вы должны использовать unset($GLOBALS['varname']), а не global $varname; unset($varname);. Более детально думаю можете узнать тут UPD для сравнения этих команд. предлогаю проверить следуюшый код: function test_global() { global $var1, $var2; $var2 =& $var1; } function test_globals() { $GLOBALS['var3'] =& $GLOBALS['var1']; } $var1 = 5; $var2 = 0; $var3 = 0; test_global(); print $var1 ." > ". $var2 ." "; echo "
"; test_globals(); print $var1 ." > ". $var3 ; результат 5 > 0 5 > 5 Но я бы посоветовал использовать следуюшую схему, когда работаете с переменнами: function myFunc(&$myVar) { $myVar = 10; } $foo = 0; myFunc($foo); var_dump($foo); // результат 10 Тут как видите, переменная передается функции как ссылка, и функция имеет право менять его значение. И Внутри функции легче понимать, что кто то тебе дал переменную и ты меняеш его значение. Лучше обойти глобальности, чем использовать его.Ответ 4
Отличие между суперглобальной переменной $GLOBALS и ключевым словом global в php на самом деле есть. Дело в том, что $GLOBALS обращается к переменной непосредственно, а global внедряет переменную из глобальной области видимости (и, насколько могу судить, только из неё) в соответствующую локальную область видимости. В документации написано об этом, но лишь вскользь. И для Zend Engine 2 и phpng ситуация аналогична.
Комментариев нет:
Отправить комментарий