Introduzione
Le strutture di controllo permettono di decidere quale parte di un programma eseguire in base a una condizione. Il costrutto if è spesso la scelta più leggibile, ma in situazioni semplici PHP offre due strumenti molto utili: l’operatore ternario e l’operatore null coalescing.
L’operatore ternario consente di scegliere tra due valori usando una sintassi compatta. È adatto quando dobbiamo assegnare un valore in base a una condizione semplice, senza scrivere un intero blocco if...else. L’operatore null coalescing, invece, è pensato per fornire un valore predefinito quando una variabile non esiste oppure contiene null.
Questi strumenti non sostituiscono sempre le strutture condizionali tradizionali. Il loro obiettivo è rendere più breve e leggibile il codice in casi mirati, come la preparazione di dati per una pagina web, la configurazione di opzioni o la costruzione di un messaggio.
Codice completo
<?php
// Dati ricevuti, ad esempio, da un form o da una richiesta HTTP.
$nome = $_GET[´nome´] ?? null;
$eta = $_GET[´eta´] ?? null;
$newsletter = $_GET[´newsletter´] ?? null;
// Operatore null coalescing:
// se $nome è null o non esiste, viene usato "Ospite".
$nomeVisualizzato = $nome ?? ´Ospite´;
// Operatore ternario:
// se l´età è almeno 18, l´utente è maggiorenne.
$statoEta = ($eta !== null && (int) $eta >= 18)
? ´maggiorenne´
: ´minorenne´;
// Il ternario può essere usato anche per un testo breve.
$messaggioNewsletter = ($newsletter === ´si´)
? ´Grazie per esserti iscritto alla newsletter.´
: ´Non hai richiesto la newsletter.´;
// Condizione tradizionale per una logica più articolata.
if ($eta === null || !is_numeric($eta)) {
$avvisoEta = ´Età non disponibile o non valida.´;
} else {
$avvisoEta = ´Età registrata correttamente.´;
}
echo ´<h1>Benvenuto, ´ . htmlspecialchars($nomeVisualizzato, ENT_QUOTES, ´UTF-8´) . ´</h1>´;
echo ´<p>Stato: ´ . htmlspecialchars($statoEta, ENT_QUOTES, ´UTF-8´) . ´</p>´;
echo ´<p>´ . htmlspecialchars($messaggioNewsletter, ENT_QUOTES, ´UTF-8´) . ´</p>´;
echo ´<p>´ . htmlspecialchars($avvisoEta, ENT_QUOTES, ´UTF-8´) . ´</p>´; Spiegazione
L’operatore ternario
La sintassi generale dell’operatore ternario è:
$risultato = condizione ? valore_se_vero : valore_se_falso; PHP valuta la condizione. Se il risultato è true, viene restituito il valore dopo il punto interrogativo. In caso contrario, viene restituito il valore dopo i due punti.
$saldo = 120;
$stato = ($saldo > 0)
? ´Disponibile´
: ´Esaurito´;
echo $stato; In questo esempio il valore di $stato sarà Disponibile. L’operatore ternario è particolarmente utile quando dobbiamo assegnare una variabile o stampare uno dei due messaggi possibili.
È possibile usare il ternario direttamente in un’istruzione:
$numero = 7;
echo ($numero % 2 === 0)
? ´Il numero è pari.´
: ´Il numero è dispari.´; Quando le condizioni diventano lunghe o contengono molti passaggi, è preferibile usare if...else. Un ternario eccessivamente complesso riduce la leggibilità, anche se produce meno righe di codice.
L’operatore null coalescing
L’operatore null coalescing usa la sintassi ??:
$valore = $variabile ?? ´Valore predefinito´; PHP restituisce il contenuto di $variabile se essa esiste e non è null. Se la variabile non esiste oppure vale null, viene restituito il valore predefinito.
Questo comportamento è molto pratico quando si leggono parametri facoltativi:
$pagina = $_GET[´pagina´] ?? 1;
$lingua = $_GET[´lingua´] ?? ´it´;
$tema = $_COOKIE[´tema´] ?? ´chiaro´; In questi casi non è necessario verificare manualmente con isset(). Il codice è più compatto e comunica immediatamente l’intenzione: usare un valore alternativo quando quello principale non è disponibile.
È possibile concatenare più operatori null coalescing:
$nome = $_GET[´nome´]
?? $_POST[´nome´]
?? ´Utente anonimo´; PHP controlla le espressioni da sinistra verso destra e utilizza il primo valore non nullo.
Differenza tra ?? e ?:
È importante non confondere il null coalescing con il cosiddetto ternario abbreviato, scritto ?:.
$valore = ´´;
// Ternario abbreviato:
// stringa vuota considerata falsa, quindi viene scelto il valore alternativo.
$risultatoTernario = $valore ?: ´Default´;
// Null coalescing:
// stringa vuota diversa da null, quindi viene mantenuta.
$risultatoNullCoalescing = $valore ?? ´Default´; Il ternario abbreviato verifica se il valore è considerato falso, includendo stringhe vuote, zero e array vuoti. L’operatore ?? controlla invece soltanto l’assenza del valore o la presenza di null. La scelta dipende quindi dal comportamento desiderato.
Best practice
- Usa il ternario per condizioni brevi: se la condizione richiede molti operatori o istruzioni, preferisci
if...else. - Inserisci le parentesi quando migliorano la chiarezza: anche se PHP può interpretare correttamente l’espressione, le parentesi rendono esplicita la condizione.
- Preferisci
??per valori facoltativi: è ideale per parametri GET, POST, cookie e chiavi di configurazione non obbligatorie. - Non usare valori predefiniti senza riflettere sul significato: un valore mancante e un valore vuoto potrebbero rappresentare situazioni diverse.
- Sanifica l’output HTML: quando stampi dati forniti dall’utente, usa
htmlspecialchars()per ridurre il rischio di attacchi XSS. - Evita ternari annidati: espressioni come
$a ? $b : ($c ? $d : $e)sono difficili da leggere e manutenere. - Valida i dati prima di usarli: l’operatore ternario decide quale valore utilizzare, ma non sostituisce una validazione completa dei dati.
Riepilogo
L’operatore ternario e l’operatore null coalescing sono strumenti di controllo utili per rendere il codice PHP più conciso. Il ternario sceglie tra due risultati in base a una condizione, mentre ?? fornisce un valore alternativo quando una variabile non esiste o vale null.
La regola principale è mantenere un equilibrio tra brevità e leggibilità. Per una scelta semplice, il ternario è efficace; per gestire valori opzionali, il null coalescing è spesso la soluzione migliore. Quando la logica diventa articolata, il costrutto if...else resta più chiaro e facilmente estendibile.
