W3docs

Суперглобальные переменные 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: доступ к любой глобальной переменной скрипта

php— editable, runs on the server

Изменение глобальных переменных

Переменная $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 главным образом в небольших скриптах или при работе с устаревшим кодом.

Практика

Практика
Какие типы переменных доступны в глобальной области видимости PHP?
Какие типы переменных доступны в глобальной области видимости PHP?
Was this page helpful?