PHP: condizioni compatte con operatore ternario e null coalescing

by theArchitect
SHARE
PHP: condizioni compatte con operatore ternario e null coalescing
© Guida-HTML5.it

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.

Approfondisci con risorse ufficiali

SHARE