$GLOBALS
(PHP 4, PHP 5, PHP 7)
$GLOBALS — Ссылки на все переменные глобальной области видимости
Описание
Ассоциативный массив (array), содержащий ссылки на все переменные глобальной области видимости скрипта, определенные в данный момент. Имена переменных являются ключами массива.
Примеры
Пример #1 Пример $GLOBALS
<?php
function test() {
$foo = "local variable";
echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
echo '$foo in current scope: ' . $foo . "\n";
}
$foo = "Example content";
test();
?>
Результатом выполнения данного примера будет что-то подобное:
$foo in global scope: Example content $foo in current scope: local variable
Примечания
Замечание:
Это 'суперглобальная' или автоматическая глобальная переменная. Это просто означает что она доступна во всех контекстах скрипта. Нет необходимости выполнять global $variable; для доступа к ней внутри метода или функции.
Замечание: Доступность переменной
В отличии от всех остальных суперглобальных переменных, $GLOBALS всегда доступна в PHP.
- Функция Суперглобальные переменные() - Суперглобальные переменные - это встроенные переменные, которые всегда доступны во всех областях видимости
- Функция $GLOBALS() - Ссылки на все переменные глобальной области видимости
- Функция $_SERVER() - Информация о сервере и среде исполнения
- Функция $_GET() - GET-переменные HTTP
- Функция $_POST() - HTTP POST variables
- Функция $_FILES() - Переменные файлов, загруженных по HTTP
- Функция $_REQUEST() - Переменные HTTP-запроса
- Функция $_SESSION() - Переменные сессии
- Функция $_ENV() - Переменные окружения
- Функция $_COOKIE() - HTTP Куки
- Функция $php_errormsg() - Предыдущее сообщение об ошибке
- Функция $HTTP_RAW_POST_DATA() - Необработанные POST-данные
- Функция $http_response_header() - Заголовки ответов HTTP
- Функция $argc() - Количество аргументов переданных скрипту
- Функция $argv() - Массив переданных скрипту аргументов
Коментарии
As of PHP 5.4 $GLOBALS is now initialized just-in-time. This means there now is an advantage to not use the $GLOBALS variable as you can avoid the overhead of initializing it. How much of an advantage that is I'm not sure, but I've never liked $GLOBALS much anyways.
Watch out when you are trying to set $GLOBALS to the local variable.
Even without reference operator "&" your variable seems to be referenced to the $GLOBALS
You can test this behaviour using below code
<?php
/**
* Result:
* POST: B, Variable: C
* GLOBALS: C, Variable: C
*/
// Testing $_POST
$_POST['A'] = 'B';
$nonReferencedPostVar = $_POST;
$nonReferencedPostVar['A'] = 'C';
echo 'POST: '.$_POST['A'].', Variable: '.$nonReferencedPostVar['A']."\n\n";
// Testing Globals
$GLOBALS['A'] = 'B';
$nonReferencedGlobalsVar = $GLOBALS;
$nonReferencedGlobalsVar['A'] = 'C';
echo 'GLOBALS: '.$GLOBALS['A'].', Variable: '.$nonReferencedGlobalsVar['A']."\n\n";
I finally found information about superglobals not being found in $GLOBALS:
https://bugs.php.net/bug.php?id=65223&edit=2
-------------------------------------
[2013-07-09 12:00 UTC] johannes @php.net
[...]super-globals (aka. auto globals) are not added to symbol tables by default for performance reasons unless the parser sees need. i.e.
<?php
$_SERVER;
print_r($GLOBALS);
?>
will list it. You can also control this using auto_gloals_jit in php.ini: ini.core#ini.auto-globals-jit
-------------------------------------
language.variables.variable
-------------------------------------
Warning
Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically.
-------------------------------------
We can be more clear with the extension of the given example.
Before PHP Version 8.1
<?php
$a = 1;
$globals = $GLOBALS;
$globals['a'] = 2;
echo $a; // 2
echo $globals['a']; // 2
echo $GLOBALS['a']; // 2
?>
After PHP Version 8.1
<?php
$a = 1;
$globals = $GLOBALS;
$globals['a'] = 2;
echo $a; // 1
echo $globals['a']; // 2
echo $GLOBALS['a']; // 1
?>