Суперглобальні змінні
Суперглобальні змінні використовуються для передачі глобального стану додатку та HTTP-зв'язку.
Головною перевагою цих змінних є те, що вони завжди і всюди доступні. На практиці це масиви значень, де ми отримуємо доступ до конкретної інформації за індексом. У різних контекстах наявність ключів може відрізнятися (пояснюється нижче).
Типи суперглобальних змінних
Всі суперглобали в PHP є масивами і позначаються знаком долара з наступним підкресленням (крім $GLOBALS) і прописними символами.
У "ППН 7", зокрема, йдеться про наступне:
Змінна | Oпис | Змінна | Oпис
|-------------|-------|
| $_GET | Параметри URL відправлені методом GET
| $_POST | Дані форми відправлені POST. Зверніть увагу, що може вести себе по-різному в ajax.
| $_REQUEST | Дані форми відправляються будь-яким методом ($_GET, $_POST та $_REQUEST).
| $_FILES | Технічна інформація про поточні завантажені файли, наприклад, через конструкцію <input type="file">
| $_SERVER | Налаштування веб-сервера, IP-адреса, конфігурація... змінюється в залежності від середовища (при виклику PHP-скрипта з Терміналу він буде містити різні значення і наприклад інформація про поточний запит буде відсутня).
| $_COOKIE | Налаштовані кукі.
| $_SESSION | Дані сесії (session), якщо вона існує і була встановлена в минулому.
| $GLOBALS | Попередження, не містить підкреслення в назві! Це так звана глобальна змінна і альтернативне позначення для ключового слова global. Якщо у вашому додатку є глобальна змінна $variable, ви також можете отримати доступ до неї з допомогою конструкції $GLOBALS["variable"]. Oднак, використання глобальних змінних є поганим і нечистим рішенням за своєю суттю, тому краще цього не робити.
| $_ENV | Інформація про поточне середовище, в якому виконується PHP.
Перерахувати всі існуючі цінності дуже просто:
foreach ($_SERVER as $key => $value {echo $key . ':' . $value . '<br>';}
Примітка: Не всі індекси повинні існувати завжди (наприклад, якщо скрипт запускає cron в режимі CLI, то індекс з URL сторінки або IP-адресою запиту не буде існувати).
Доступ до змінних
Рекомендую зробити всі глобальні змінні (крім $_SESSION) доступними тільки для читання. Це пов'язано з тим, що вони містять глобальні дані програми і інший код може це враховувати (наприклад, інша встановлена бібліотека).
Ще одним недоліком глобального стану є те, що не завжди можна покладатися на точні значення, навіть якщо вони існують, тому завжди слід перевіряти їх ключі за допомогою конструкції isset().
Щоб зберегти новий файл cookie, використовуйте setcookie() і не вставляйте значення безпосередньо. Це пов'язано з тим, що він призначений лише для читання.
Вивчені уроки
Ніколи не довіряйте сліпо значенням надглобальних змінних!
Користувач може використовувати URL-адресу та надіслані заголовки, щоб впливати на те, як встановлюються значення. Всі вхідні дані завжди повинні бути ретельно перевірені.
Реєстрація глобалів - проблема старої версії PHP
У старій версії PHP (до 5.4.0) існувала спеціальна директива register-globals (налаштовується в php.ini), яка призводила до того, що всі передані параметри в URL автоматично реєструвалися як змінні.
Наприклад:
Користувач звернувся за адресою: https://example.com/script.php?var=24.
І PHP автоматично створив всередині скрипта змінну $var зі значенням 24.
Так що це спрацювало класично:
echo $var;
Таким чином, будь-хто міг вставити в скрипт будь-яку змінну і змінити її вміст. Oчевидно, що безпека не завжди була пріоритетом. Не зовсім.
Інші джерела
Більш детальний опис дивіться в офіційній інструкції.