Суперглобальные переменные PHP и переменная $GLOBALS
PHP предоставляет набор суперглобальных переменных, доступных в любой части скрипта. Узнайте, что такое $GLOBALS и как с ней работать.
В PHP переменная, объявленная вне любой функции, живёт в глобальной области видимости. По умолчанию код внутри функции не видит эти переменные — PHP разделяет области видимости, чтобы локальная логика случайно не затронула несвязанные данные. Массив $GLOBALS — один из способов преодолеть эту границу: это встроенная суперглобальная переменная, которая содержит ссылки на все переменные, определённые в глобальной области видимости, с ключами по именам переменных.
На этой странице объясняется, что такое $GLOBALS, чем она отличается от ключевого слова global, как читать и изменять глобальные переменные через неё и почему в большинстве случаев стоит искать альтернативу. Если вы только знакомитесь с областями видимости, начните с Область видимости переменных и Переменные PHP.
Что такое суперглобальные переменные PHP?
Суперглобальные переменные — это специальные предопределённые переменные PHP, доступные во всех областях видимости скрипта. Вы можете обращаться к ним внутри любой функции, метода или подключаемого файла без предварительного объявления через global. PHP заполняет их автоматически до запуска вашего кода.
Полный список суперглобальных переменных:
$_GET— данные, переданные через строку запроса URL.$_POST— данные, переданные через отправку формы.$_COOKIE— данные, переданные через cookies.$_SESSION— данные, хранящиеся в сессии пользователя.$_REQUEST— объединённые данные$_GET,$_POSTи$_COOKIE.$_SERVER— информация о сервере и среде выполнения.$_ENV— переменные окружения.$_FILES— файлы, загруженные через HTTP-форму с методомPOST.$GLOBALS— ссылка на каждую переменную в глобальной области видимости.
Обзор суперглобальных переменных, связанных с запросами, см. в разделе Суперглобальные переменные PHP.
Что такое переменная $GLOBALS в PHP?
$GLOBALS — это ассоциативный массив, ключами которого являются имена ваших глобальных переменных (без ведущего $), а значениями — ссылки на эти переменные. Поскольку она является суперглобальной, она работает из любого места: $GLOBALS['x'] обращается к той же переменной, что и $x на верхнем уровне, независимо от того, где в скрипте вы к ней обращаетесь.
Вот пример использования переменной $GLOBALS для доступа к глобальной переменной:
Пример PHP: использование переменной $GLOBALS для доступа к глобальной переменной
<?php
$x = 10;
$y = 20;
function add() {
global $x, $y;
return $x + $y;
}
echo add(); // 30
echo $GLOBALS['x']; // 10
echo $GLOBALS['y']; // 20
?>В этом примере функция add() использует ключевое слово global для доступа к переменным $x и $y. Вне функции $GLOBALS['x'] и $GLOBALS['y'] обращаются к тем же самым переменным — никакое объявление global не требуется.
$GLOBALS и ключевое слово global
Оба подхода решают одну задачу, но по-разному:
- Ключевое слово
globalимпортирует глобальную переменную в локальную область видимости, создавая локальный псевдоним, который затем используется под обычным именем ($x). Нужно перечислить каждую нужную переменную явно. $GLOBALS— это массив, индексируемый по имени ($GLOBALS['x']). Ничего объявлять не нужно, и ключ можно формировать динамически (например,$GLOBALS[$name]).
<?php
$total = 100;
function withGlobalKeyword() {
global $total;
return $total; // uses the local alias
}
function withGlobalsArray() {
return $GLOBALS['total']; // indexes the superglobal directly
}
echo withGlobalKeyword(); // 100
echo "\n";
echo withGlobalsArray(); // 100
?>Оба выводят 100. Выбирайте тот вариант, который лучше читается — но учтите, что начиная с PHP 8.1 нельзя переназначить массив $GLOBALS целиком (например, $GLOBALS = [...]). Запись в отдельные элементы, такие как $GLOBALS['x'] = 5, по-прежнему работает.
Как использовать переменную $GLOBALS в PHP
Переменная $GLOBALS — мощный инструмент в PHP, с помощью которого можно получить доступ к глобальным переменным из любой части скрипта. Рассмотрим несколько способов её использования:
Доступ к глобальным переменным
Как мы видели в предыдущем примере, через $GLOBALS можно получить доступ к любой глобальной переменной, определённой в скрипте. Ещё один пример:
PHP: доступ к любой глобальной переменной скрипта
Изменение глобальных переменных
Переменная $GLOBALS также позволяет изменять глобальные переменные. Это может быть полезно, когда нужно внести изменения в глобальную переменную из функции или класса.
Пример:
PHP: изменение глобальных переменных
<?php
$counter = 0;
function increment() {
global $counter;
$counter++;
}
increment();
echo $counter; // 1
echo "\n";
$GLOBALS['counter'] = 10;
echo $counter; // 10
?>В этом примере функция increment() увеличивает значение переменной $counter. Однако значение $counter можно также изменить напрямую через переменную $GLOBALS.
Передача переменных между функциями и классами
Переменная $GLOBALS также может использоваться для передачи переменных между функциями и классами. Это удобно, когда нужно обмениваться данными между разными частями скрипта.
Пример:
PHP: передача глобальных переменных между функциями и классами
<?php
$data = array("name" => "John Doe", "age" => 30);
function display_data() {
global $data;
print_r($data);
}
class User {
function show_data() {
global $data;
print_r($data);
}
}
display_data(); // Array ( [name] => John Doe [age] => 30 )
$user = new User();
$user->show_data(); // Array ( [name] => John Doe [age] => 30 )
$GLOBALS['data']['email'] = "[email protected]";
display_data(); // Array ( [name] => John Doe [age] => 30 [email] => [email protected] )
$user->show_data(); // Array ( [name] => John Doe [age] => 30 [email] => [email protected] )
?>В этом примере функция display_data() и класс User обращаются к переменной $data через $GLOBALS. Это позволяет передавать переменную $data между разными частями скрипта.
Заключение
Переменная $GLOBALS — мощный инструмент PHP, обеспечивающий доступ ко всем глобальным переменным, определённым в скрипте. Будь то чтение, изменение или передача переменных между функциями и классами — $GLOBALS является универсальным инструментом, помогающим писать более гибкий PHP-код.
Рекомендации по лучшим практикам: несмотря на полезность $GLOBALS, в современной разработке на PHP не рекомендуется активно использовать глобальные переменные. Глобальное состояние затрудняет тестирование и понимание кода, поскольку любая функция может незаметно изменить значение, от которого зависит другая часть программы. Предпочтительнее передавать переменные в качестве аргументов функций, возвращать значения или использовать свойства классов для лучшей инкапсуляции и тестируемости. Прибегайте к $GLOBALS главным образом в небольших скриптах или при работе с устаревшим кодом.