L'operatore ternario è un if/else che sta in una sola espressione: condition ? valueIfTrue : valueIfFalse. Restituisce uno dei due valori, quindi puoi assegnarlo, stamparlo con echo o passarlo a una funzione.
Cambia $age in 15 e $items in 3 ed esegui di nuovo. Nota le parentesi attorno al ternario nell'ultima riga: senza di esse il . unirebbe prima le stringhe e il risultato non sarebbe quello voluto.
Il ternario nei template HTML
Il ternario è il modo abituale per scegliere una classe CSS, un'etichetta o un attributo dentro un template. Questo blocco legge ?stock= dall'URL: eseguilo, poi clicca i link nella scheda Page e lo stesso script gira di nuovo con un valore diverso.
<?= ... ?> è la forma breve di <?php echo ... ?>, e mantiene leggibili le condizioni su una riga dentro il markup.
Il ternario breve ?: (l'operatore Elvis)
Se ometti la parte centrale ottieni $a ?: $b: restituisce $a quando $a è truthy, altrimenti $b. È comodo per i valori predefiniti quando anche una stringa vuota o 0 devono ripiegare sul default.
I valori falsy sono false, 0, 0.0, "", "0", [] e null. Se nei tuoi dati "0" è una risposta valida (un campo quantità, un PIN), il ternario breve lo scarterà.
?: vs ??
Si somigliano ma controllano cose diverse. ?: ripiega quando il lato sinistro è falsy. ?? ripiega solo quando il lato sinistro è null o non impostato, e non dà warning per una variabile o una chiave di array mancante.
Usa ?? per "il valore potrebbe non esistere" (dati della richiesta, array di configurazione, chiavi facoltative). Usa ?: per "il valore esiste ma potrebbe essere vuoto". La pagina sull'operatore di null coalescing tratta ?? e ??= in dettaglio.
Il ternario annidato richiede le parentesi
PHP 7 leggeva a ? b : c ? d : e da sinistra a destra, a differenza di quasi tutti gli altri linguaggi, e produceva risultati sbagliati. PHP 8 si rifiuta di indovinare:
<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2
Aggiungi le parentesi attorno al ternario interno e funziona:
Il ternario breve fa eccezione: $a ?: $b ?: $c è consentito senza parentesi, come nell'esempio Elvis qui sopra.
Usa match(true) quando i rami sono più di due
Un ternario annidato su tre o quattro livelli è difficile da leggere anche con le parentesi. match con true come soggetto controlla le condizioni dall'alto in basso e restituisce il primo ramo che corrisponde:
Tieni il ternario per due esiti su una riga, e passa a match o a una catena if/elseif non appena te ne serve un terzo.
Domande frequenti
Cos'è l'operatore ternario in PHP?
Una forma breve di if/else che restituisce un valore: $label = $age >= 18 ? 'adult' : 'minor';. Se la condizione prima di ? è vera, si usa l'espressione dopo ?, altrimenti quella dopo :.
Cosa significa ?: in PHP?
$a ?: $b è il ternario breve (chiamato anche operatore Elvis). Restituisce $a se $a è truthy e $b altrimenti, quindi '' ?: 'default' è 'default'. È come $a ? $a : $b, ma $a viene valutato una volta sola.
Si possono annidare gli operatori ternari in PHP?
Solo con le parentesi. Da PHP 8, $a ? 'x' : $b ? 'y' : 'z' è un errore fatale, quindi scrivi $a ? 'x' : ($b ? 'y' : 'z'). Con più di due rami, match(true) o una catena if/elseif è più leggibile.
Posso usare un ternario senza la parte else?
No, il ternario richiede sempre entrambi i rami. Per "usa questo valore oppure ripiega" scrivi $x ?: 'default' o $x ?? 'default'; per fare qualcosa solo quando una condizione è vera, scrivi un normale if oppure $condition && doSomething();.