W3docs

PHP Суперглобальные переменные

PHP предлагает встроенные переменные, доступные в любой области видимости без объявления — суперглобальные переменные.

PHP Суперглобальные переменные

Суперглобальные переменные — это встроенные переменные PHP, которые всегда доступны в любой области видимости без какого-либо объявления. В отличие от обычных переменных, вам не нужно писать global $var;, чтобы использовать их внутри функции — они видны везде автоматически. Они служат мостом между внешним миром (браузером, веб-сервером, операционной системой) и вашим PHP-скриптом: входящие данные форм, куки, состояние сессии и метаданные запроса поступают через суперглобальные переменные.

В этой главе рассказывается, что содержит каждая суперглобальная переменная, когда её применять и какие угрозы безопасности часто подстерегают начинающих разработчиков.

Что такое суперглобальные переменные PHP?

Суперглобальная переменная — это предопределённый ассоциативный массив, который PHP заполняет перед запуском вашего скрипта. Существует девять суперглобальных переменных:

СуперглобальнаяСодержитТипичное применение
$_GETПараметры строки запроса (?key=value)Поиск, пагинация, фильтры
$_POSTПоля формы, переданные в теле запросаВход, регистрация, ввод данных
$_REQUESTОбъединение $_GET, $_POST и $_COOKIEУдобный доступ (используйте с осторожностью)
$_FILESФайлы, загруженные через multipart-формуЗагрузка файлов / изображений
$_COOKIEКуки, отправленные браузером«Запомнить меня», настройки
$_SESSIONДанные пользователя, хранящиеся на сервереСостояние входа, корзина покупок
$_SERVERИнформация о сервере и запросе (заголовки, пути)Маршрутизация, определение метода HTTP
$_ENVПеременные окруженияКонфигурация, секреты, API-ключи
$GLOBALSВсе переменные в глобальной области видимостиДоступ к глобальным переменным внутри функции

Поскольку это массивы, значение считывается по ключу — например $_GET['name'] — а весь массив можно просмотреть с помощью print_r() или var_dump() при отладке.

Безопасность прежде всего. Всё, что находится в $_GET, $_POST, $_REQUEST, $_COOKIE и $_FILES, поступает от пользователя и должно считаться ненадёжным. Всегда проверяйте наличие ключа, затем валидируйте и экранируйте значение перед использованием. Пренебрежение этим правилом открывает дверь для XSS, SQL-инъекций и нарушения логики приложения.

$_GET

$_GET собирает параметры из строки запроса URL. Для URL example.com/?name=John&page=2 PHP заполняет $_GET следующим образом:

// URL: example.com/?name=John&page=2
$_GET = ['name' => 'John', 'page' => '2'];

$name = $_GET['name'] ?? 'guest';   // 'John'
$page = (int) ($_GET['page'] ?? 1); // 2
echo "Hello, $name — viewing page $page";

Используйте $_GET для данных, которые безопасно показывать в URL и которые можно добавить в закладки или передать другим: поисковые запросы, номера страниц, порядок сортировки. Обратите внимание на оператор ?? (null-объединение) — он задаёт резервное значение, чтобы отсутствующие ключи не вызывали предупреждение «undefined array key». Никогда не помещайте пароли или конфиденциальные данные в $_GET, поскольку URL записывается в журналы, кэшируется и отображается в адресной строке.

$_POST

$_POST собирает данные, отправленные в теле HTTP-запроса — как правило, из формы с атрибутом method="post". Значения не отображаются в URL, что делает $_POST правильным выбором для форм входа и любых действий, изменяющих данные.

// <form method="post"><input name="email"> ... </form>
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = trim($_POST['email'] ?? '');
    if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        echo "Stored: $email";
    } else {
        echo "Please enter a valid email address.";
    }
}

И $_GET, и $_POST широко используются при работе с формами — см. Обработка форм PHP и Валидация форм PHP с полными проверенными примерами.

$_REQUEST

$_REQUEST — удобный массив, объединяющий $_GET, $_POST и $_COOKIE. Он позволяет считывать значение вне зависимости от способа его передачи:

$id = $_REQUEST['id'] ?? null;

Используйте его с осторожностью. Поскольку порядок, в котором три источника перезаписывают друг друга, определяется параметром request_order в php.ini, куки может незаметно перекрыть поле POST. Для предсказуемого и безопасного кода предпочтительнее использовать конкретную суперглобальную переменную ($_GET или $_POST), которую вы ожидаете.

$_FILES

$_FILES хранит метаданные о файлах, загруженных через форму с атрибутом enctype="multipart/form-data". Для поля с именем avatar вы получаете массив с оригинальным именем, MIME-типом, временным путём, кодом ошибки и размером:

// <form method="post" enctype="multipart/form-data">
//   <input type="file" name="avatar">
// </form>
if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
    $tmp  = $_FILES['avatar']['tmp_name'];
    $name = basename($_FILES['avatar']['name']);
    move_uploaded_file($tmp, __DIR__ . "/uploads/$name");
    echo "Uploaded $name";
}

Всегда проверяйте ключ error и валидируйте тип и размер файла перед вызовом move_uploaded_file() — никогда не доверяйте name или type, предоставленным клиентом.

$_COOKIE содержит куки, отправленные браузером вместе с запросом. Кука — это небольшой фрагмент данных, хранящийся в браузере и возвращаемый при каждом последующем запросе; удобен для запоминания настроек или токена «оставаться в системе».

// Cookies are set with setcookie(), then read on the NEXT request:
setcookie('theme', 'dark', time() + 86400); // expires in 1 day

$theme = $_COOKIE['theme'] ?? 'light';
echo "Current theme: $theme";

Кука, установленная с помощью setcookie(), не доступна в $_COOKIE до следующего запроса, потому что она сначала отправляется в браузер и возвращается лишь после. Полный жизненный цикл описан в разделе PHP Куки.

$_SESSION

$_SESSION хранит данные пользователя на сервере, идентифицируя их по идентификатору сессии, который передаётся в куке. Поскольку данные находятся на сервере, они безопаснее куки для хранения конфиденциального состояния, например «вошёл ли этот пользователь в систему».

Перед чтением или записью $_SESSION необходимо вызвать session_start():

session_start();

$_SESSION['user_id'] = 42;        // write
$id = $_SESSION['user_id'] ?? 0;  // read on any page
echo "Logged-in user: $id";

Полный пример входа в систему и сведения о времени жизни сессии см. в разделе PHP Сессии.

$_SERVER

$_SERVER заполняется веб-сервером информацией о запросе и среде выполнения. Часто используемые ключи:

$method = $_SERVER['REQUEST_METHOD']; // 'GET' or 'POST'
$host   = $_SERVER['HTTP_HOST'];      // 'www.example.com'
$uri    = $_SERVER['REQUEST_URI'];    // '/products?id=5'
$ip     = $_SERVER['REMOTE_ADDR'];    // visitor's IP address

if ($method === 'POST') {
    echo "Handling a form submission from $ip";
}

$_SERVER['REQUEST_METHOD'] — стандартный способ определить, была ли страница загружена обычным образом (GET) или отправлена форма (POST).

$_ENV и $GLOBALS

$_ENV предоставляет доступ к переменным окружения операционной системы, где современные приложения хранят конфигурацию и секреты, чтобы они не попадали в исходный код:

$dbHost = $_ENV['DB_HOST'] ?? 'localhost';
$apiKey = getenv('API_KEY'); // getenv() also reads the environment

$GLOBALS — это массив всех переменных, определённых в глобальной области видимости. Он позволяет функции получить доступ к глобальной переменной без ключевого слова global:

$counter = 10;

function increment() {
    $GLOBALS['counter']++; // modifies the global $counter
}
increment();
echo $counter; // 11

$GLOBALS редко бывает правильным инструментом — передача данных через аргументы функции чище. Чтобы понять почему, прочитайте Область видимости переменных PHP.

Заключение

Суперглобальные переменные PHP — стандартный способ считывания входных данных и информации о запросе в веб-приложении на PHP. Используйте $_GET для параметров URL, $_POST для отправки форм, $_FILES для загрузки файлов, $_COOKIE и $_SESSION для хранения пользовательского состояния, а $_SERVER/$_ENV — для сведений о запросе и среде выполнения. Одно правило применимо ко всем: данные, поступающие из браузера, являются ненадёжными — валидируйте и экранируйте их каждый раз. Продолжите изучение с раздела Валидация форм PHP, где эти суперглобальные переменные применяются в реальной защищённой форме.

Практика

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