Superglobali PHP
Le superglobali PHP sono variabili predefinite disponibili in ogni ambito, usate per gestire form, cookie, sessioni e dati del server.
Superglobali PHP
Le superglobali sono variabili PHP predefinite sempre disponibili, in ogni ambito, senza alcuna dichiarazione. A differenza delle variabili ordinarie, non è necessario scrivere global $var; per utilizzarle all'interno di una funzione — sono visibili ovunque automaticamente. Rappresentano il ponte tra il mondo esterno (il browser, il server web, il sistema operativo) e lo script PHP: i dati dei form in ingresso, i cookie, lo stato della sessione e i metadati della richiesta arrivano tutti tramite le superglobali.
Questo capitolo illustra il contenuto di ciascuna superglobale, quando utilizzarla e le insidie di sicurezza che mettono in difficoltà la maggior parte dei principianti.
Cosa sono le superglobali PHP?
Una superglobale è un array associativo predefinito che PHP popola prima dell'esecuzione dello script. Esistono nove superglobali:
| Superglobale | Contiene | Utilizzo tipico |
|---|---|---|
$_GET | Parametri della query string (?key=value) | Ricerca, paginazione, filtri |
$_POST | Campi del form inviati nel corpo della richiesta | Login, registrazione, inserimento dati |
$_REQUEST | Unione di $_GET, $_POST e $_COOKIE | Comodità (usare con cautela) |
$_FILES | File caricati tramite un form multipart | Caricamento file/immagini |
$_COOKIE | Cookie inviati dal browser | "Ricordami", preferenze |
$_SESSION | Dati per utente memorizzati sul server | Stato di login, carrelli della spesa |
$_SERVER | Informazioni sul server e sulla richiesta (header, percorsi) | Routing, rilevamento del metodo HTTP |
$_ENV | Variabili d'ambiente | Configurazione, segreti, chiavi API |
$GLOBALS | Tutte le variabili nell'ambito globale | Accesso alle variabili globali dall'interno di una funzione |
Poiché sono array, si legge un valore tramite chiave — ad esempio $_GET['name'] — ed è possibile ispezionare l'intero array con print_r() o var_dump() durante il debug.
La sicurezza prima di tutto. Tutto ciò che si trova in
$_GET,$_POST,$_REQUEST,$_COOKIEe$_FILESproviene dall'utente e deve essere trattato come non attendibile. Verificare sempre che una chiave esista, quindi validarla e neutralizzarla prima dell'uso. Trascurare questo aspetto apre la porta a XSS, SQL injection e logica difettosa.
$_GET
$_GET raccoglie i parametri dalla query string dell'URL. Per l'URL example.com/?name=John&page=2, PHP popola $_GET in questo modo:
// 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";Utilizzare $_GET per dati che è sicuro esporre nell'URL e che possono essere salvati nei preferiti o condivisi: termini di ricerca, numeri di pagina, ordinamento. Si noti l'operatore ?? (null coalescing) — fornisce un valore predefinito in modo che le chiavi mancanti non generino un avviso "undefined array key". Non inserire mai password o dati sensibili in $_GET, poiché l'URL viene registrato, memorizzato nella cache ed è visibile nella barra degli indirizzi.
$_POST
$_POST raccoglie i dati inviati nel corpo della richiesta HTTP, tipicamente da un form con method="post". I valori non vengono mostrati nell'URL, il che rende $_POST la scelta giusta per i form di login e qualsiasi azione che modifichi dati.
// <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.";
}
}Sia $_GET che $_POST sono fondamentali per lavorare con i form — vedere Gestione dei Form PHP e Validazione dei Form PHP per esempi completi e validati.
$_REQUEST
$_REQUEST è un array di comodità che unisce $_GET, $_POST e $_COOKIE. Consente di leggere un valore indipendentemente da come è stato inviato:
$id = $_REQUEST['id'] ?? null;Usarlo con parsimonia. Poiché l'ordine in cui le tre fonti si sovrascrivono è controllato dall'impostazione request_order in php.ini, un cookie potrebbe silenziosamente oscurare un campo POST. Per un codice prevedibile e sicuro, preferire la superglobale specifica ($_GET o $_POST) che si prevede effettivamente di utilizzare.
$_FILES
$_FILES contiene i metadati relativi ai file caricati tramite un form che usa enctype="multipart/form-data". Per un input denominato avatar, si ottiene un array con il nome originale, il tipo MIME, il percorso temporaneo, il codice di errore e la dimensione:
// <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";
}Verificare sempre la chiave error e validare il tipo e la dimensione del file prima di chiamare move_uploaded_file() — non fidarsi mai del name o del type forniti dal client.
$_COOKIE
$_COOKIE contiene i cookie inviati dal browser con la richiesta. Un cookie è un piccolo dato memorizzato nel browser e restituito ad ogni richiesta successiva, utile per ricordare le preferenze o un token "rimani connesso".
// 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";Un cookie impostato con setcookie() non è disponibile in $_COOKIE fino alla richiesta successiva, perché viaggia prima verso il browser e ritorna in seguito. Per il ciclo di vita completo, vedere Cookie PHP.
$_SESSION
$_SESSION memorizza dati per utente sul server, identificati da un ID di sessione che viaggia in un cookie. Poiché i dati risiedono sul server, è più sicuro di un cookie per uno stato sensibile come "questo utente è autenticato".
È necessario chiamare session_start() prima di leggere o scrivere su $_SESSION:
session_start();
$_SESSION['user_id'] = 42; // write
$id = $_SESSION['user_id'] ?? 0; // read on any page
echo "Logged-in user: $id";Vedere Sessioni PHP per un esempio di login completo e dettagli sulla durata della sessione.
$_SERVER
$_SERVER viene popolato dal server web con informazioni sulla richiesta e sull'ambiente. Chiavi comuni:
$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'] è il modo standard per stabilire se una pagina è stata caricata normalmente (GET) o se un form è stato inviato (POST).
$_ENV e $GLOBALS
$_ENV espone le variabili d'ambiente del sistema operativo, che nelle applicazioni moderne vengono usate per conservare configurazione e segreti fuori dal codice sorgente:
$dbHost = $_ENV['DB_HOST'] ?? 'localhost';
$apiKey = getenv('API_KEY'); // getenv() also reads the environment$GLOBALS è un array di tutte le variabili definite nell'ambito globale. Consente a una funzione di accedere a una variabile globale senza la parola chiave global:
$counter = 10;
function increment() {
$GLOBALS['counter']++; // modifies the global $counter
}
increment();
echo $counter; // 11$GLOBALS è raramente la soluzione giusta — passare i dati come argomenti di funzione è più pulito. Per capire il perché, leggere Ambito delle Variabili PHP.
Conclusione
Le superglobali PHP sono il modo standard per leggere input e informazioni sulle richieste in un'applicazione web PHP. Utilizzare $_GET per i parametri URL, $_POST per l'invio dei form, $_FILES per i caricamenti, $_COOKIE e $_SESSION per lo stato per utente, e $_SERVER/$_ENV per i dettagli della richiesta e dell'ambiente. La regola che si applica a tutte: i dati che provengono dal browser non sono attendibili — validarli e neutralizzarli ogni volta. Da qui, proseguire con Validazione dei Form PHP per vedere queste superglobali applicate a un form reale e sicuro.