Суперглобальні змінні доступні в будь-якому місці коду без global:
$_GET,$_POST- параметри рядка запиту й тіла форми;$_COOKIE,$_FILES,$_REQUEST(суміш перших трьох);$_SERVER- заголовки, метод, шлях, IP, змінні середовища сервера;$_SESSION,$_ENV,$GLOBALS.
Чому не брати дані напряму:
- Усе - від користувача і все - рядки чи масиви.
$_GET['id']може бути'5','5 OR 1=1', масивом['x'](?id[]=x) чи взагалі відсутнім. Без валідації це шлях до SQL-ін'єкцій, XSS і помилок типів. - Глобальний стан. Код, що читає
$_POSTу глибині сервісу, неможливо протестувати без підробки глобальних змінних і неможливо перевикористати в консольній команді чи черзі. $_REQUESTзмішує джерела, і порядок пріоритету залежить від налаштувань (request_order) - незрозуміло, звідки прийшло значення.$_SERVERтеж від клієнта:HTTP_HOST,HTTP_X_FORWARDED_FOR, будь-якіHTTP_*- це заголовки, які можна підробити.
У фреймворку - об'єкт запиту і валідація:
public function update(Request $request, Post $post)
{
$data = $request->validate([
'title' => ['required', 'string', 'max:200'],
'published' => ['boolean'],
]);
$post->update($data);
}
Запит передається явно (його легко підробити в тесті), дані проходять перевірку, а $request->ip() враховує налаштування довірених проксі замість сирого заголовка.
У довгоживучих серверах (Octane) суперглобальні змінні й зовсім ненадійні: фреймворк сам формує об'єкт запиту для кожного запиту.