Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Разница между global и $GLOBALS

#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 ситуация аналогична.

Комментариев нет:

Отправить комментарий