Menu

Operatore ternario PHP: forma breve ?: e ternari annidati

L'operatore ternario PHP è un if/else su una riga: $result = $condition ? 'yes' : 'no';. Impara il ternario breve ?: (operatore Elvis), in cosa differisce da ??, perché da PHP 8 i ternari annidati richiedono le parentesi e quando match è la scelta più pulita.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

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();.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA