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
$_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, где эти суперглобальные переменные применяются в реальной защищённой форме.