Introduzione
Tra gli operatori più utili e spesso sottovalutati in PHP c’è l’operatore di coalescenza nulla, introdotto con ??. È uno strumento pratico per gestire variabili che potrebbero non essere definite oppure che potrebbero contenere null, senza dover scrivere controlli lunghi e ripetitivi con isset() o con strutture condizionali più verbose.
Questo operatore è particolarmente comodo quando lavori con dati provenienti da:
- moduli HTML
- parametri GET o POST
- configurazioni opzionali
- array associativi con chiavi non sempre presenti
- valori di fallback in applicazioni web
In pratica, ?? ti permette di dire: “usa questo valore se esiste e non è null, altrimenti usa questo altro”. È una soluzione elegante, leggibile e molto comune nel codice moderno PHP.
Codice completo
<?php
// Simuliamo alcuni dati che potrebbero arrivare da un form o da una richiesta HTTP
$input = [
´nome´ => ´Luca´,
// ´email´ non è presente
´ruolo´ => null,
´lingua´ => ´it´
];
// Valore di default quando il campo non esiste o è null
$nome = $input[´nome´] ?? ´Ospite´;
$email = $input[´email´] ?? ´[email protected]´;
$ruolo = $input[´ruolo´] ?? ´utente´;
$lingua = $input[´lingua´] ?? ´en´;
// Uso tipico con parametri GET
$page = $_GET[´page´] ?? ´home´;
$sort = $_GET[´sort´] ?? ´asc´;
// Output di esempio
echo "Nome: " . $nome . PHP_EOL;
echo "Email: " . $email . PHP_EOL;
echo "Ruolo: " . $ruolo . PHP_EOL;
echo "Lingua: " . $lingua . PHP_EOL;
echo "Pagina: " . $page . PHP_EOL;
echo "Ordine: " . $sort . PHP_EOL;
// Esempio con fallback multiplo
$timezone = $_POST[´timezone´] ?? $_GET[´timezone´] ?? ´Europe/Rome´;
echo "Timezone: " . $timezone . PHP_EOL;
// Confronto con la forma tradizionale
$eta = isset($_GET[´eta´]) ? $_GET[´eta´] : 18;
echo "Età: " . $eta . PHP_EOL;
// Attenzione: ?? non sostituisce una stringa vuota
$nickname = $_GET[´nickname´] ?? ´anonimo´;
echo "Nickname: " . $nickname . PHP_EOL;
?> Spiegazione
L’operatore ?? controlla se il valore a sinistra esiste ed è diverso da null. Se sì, restituisce quel valore. Altrimenti restituisce il valore a destra.
1. Sintassi base
La forma generale è:
$valore = $variabile ?? ´valore di default´; Questo equivale, in modo semplificato, a scrivere un controllo su isset(), ma in modo molto più compatto.
2. Differenza tra null e variabile non definita
Uno dei vantaggi principali di ?? è che evita errori quando una chiave di array o una variabile non esiste. Per esempio:
$nome = $dati[´nome´] ?? ´sconosciuto´; Se $dati[´nome´] non è presente, PHP non genera un notice: usa direttamente il valore di fallback.
3. Catena di fallback
Puoi concatenare più coalescenze per cercare il primo valore disponibile:
$timezone = $_POST[´timezone´] ?? $_GET[´timezone´] ?? ´Europe/Rome´; In questo caso PHP controlla prima $_POST, poi $_GET, e infine usa il valore di default se nessuno dei due è disponibile.
4. Differenza con una stringa vuota
Un punto importante: ?? non considera la stringa vuota come assenza di valore. Se la variabile esiste e contiene "", l’operatore la restituisce comunque.
$nickname = $_GET[´nickname´] ?? ´anonimo´; Se nickname è presente ma vuoto, il risultato sarà una stringa vuota, non anonimo. Se vuoi trattare anche il vuoto come valore mancante, devi usare controlli più specifici.
5. Confronto con l’operatore ternario e isset()
Prima di ??, si usava spesso:
$eta = isset($_GET[´eta´]) ? $_GET[´eta´] : 18; La versione con coalescenza è più breve e leggibile:
$eta = $_GET[´eta´] ?? 18; In molti casi, questa forma è preferibile perché riduce il rumore visivo e rende il codice più immediato da leggere.
Best practice
- Usa ?? per valori opzionali: è perfetto per input utente, configurazioni e dati non garantiti.
- Preferisci la leggibilità: se la logica diventa troppo complessa, meglio separare i controlli in più righe.
- Non confondere null con stringa vuota: se ti serve trattare "" come valore assente, usa funzioni o controlli adatti al caso.
- Usa fallback sensati: il valore di default deve avere senso nel dominio applicativo, non essere scelto a caso.
- Attenzione ai dati esterni: anche se ?? aiuta a evitare errori, non sostituisce la validazione dei dati ricevuti.
- Combina ?? con sanitizzazione: prima di mostrare o salvare dati esterni, valida e pulisci sempre l’input.
Un esempio concreto: in un pannello amministrativo, se l’utente non imposta il numero di elementi per pagina, puoi usare un default sicuro:
$perPagina = $_GET[´per_page´] ?? 20; Così eviti di interrompere il flusso dell’applicazione e mantieni un comportamento prevedibile.
Riepilogo
L’operatore di coalescenza nulla ?? è uno degli strumenti più pratici di PHP moderno per gestire valori mancanti in modo elegante.
- Permette di definire un valore di default in modo compatto.
- Funziona con variabili non definite e valori null.
- È utile con array associativi, parametri HTTP e configurazioni.
- Può essere concatenato per creare fallback multipli.
- Non sostituisce la validazione dei dati, ma la rende più semplice da integrare.
Se vuoi scrivere codice PHP pulito e moderno, imparare a usare bene ?? è un passo fondamentale. Ti aiuta a evitare controlli ripetitivi, riduce gli errori e migliora la leggibilità del progetto.
Approfondisci con risorse ufficiali
- Manuale PHP - Operatori di confronto: documentazione ufficiale sugli operatori, inclusa la coalescenza nulla.
- Manuale PHP - isset(): utile per capire il comportamento su variabili definite o non definite.
- Manuale PHP - Arrays: per approfondire l’accesso sicuro alle chiavi associative.
- Manuale PHP - Superglobali: per lavorare correttamente con $_GET, $_POST, $_SERVER e altre variabili globali.
