Menu

Operatore di null coalescing PHP: ?? e ??=

L'operatore di null coalescing PHP restituisce il lato sinistro a meno che non sia null o non impostato: $name = $_GET['name'] ?? 'Guest';. Non dà mai warning per una variabile o una chiave di array mancante. Impara le catene di ??, l'assegnazione ??=, ?? vs ?: e l'operatore nullsafe ?->.

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

?? restituisce il valore alla sua sinistra se esiste e non è null, altrimenti il valore alla sua destra: $name = $_GET['name'] ?? 'Guest';. A differenza della lettura diretta della chiave, non dà mai warning quando la variabile o la chiave dell'array mancano.

Alla prima esecuzione non c'è query string, quindi vengono usati entrambi i valori predefiniti. Clicca un link nella scheda Page e lo script gira di nuovo con $_GET compilato. Leggere $_GET["name"] senza ?? in quella prima esecuzione stamperebbe Warning: Undefined array key "name" su una normale installazione di PHP. Altro sui dati della richiesta nella pagina su GETe_GET e _POST.

?? è un controllo isset() abbreviato

$a ?? $b significa esattamente isset($a) ? $a : $b. Funziona su variabili, chiavi di array a qualsiasi profondità e proprietà di oggetti, e si ferma al primo pezzo mancante senza lamentarsi.

Il controllo è lo stesso che fa isset, quindi anche una chiave che esiste con valore null prende il valore predefinito.

Concatenare ?? per provare più sorgenti

?? è associativo a destra e puoi concatenarne quanti ne vuoi. PHP restituisce il primo operando impostato e non null.

??= assegna solo quando il valore è null

$a ??= $b salva $b in $a solo quando $a non è impostata o è null. È il modo più breve per compilare i valori predefiniti o per calcolare qualcosa una volta sola e riusarlo.

Il lato destro di ??= viene valutato solo quando l'assegnazione avviene, ed è per questo che computing 4 compare una sola volta.

?? vs ?: (ternario breve)

?? verifica null. ?: verifica la truthiness. Con valori come 0, "" e "0" danno risposte diverse:

Una quantità di "0" è un input reale: ?? lo mantiene, ?: lo sostituisce. ?: da solo darebbe un warning per la chiave mancante, ed è per questo che il blocco lo avvolge come ($inputs[$key] ?? null) ?: .... La pagina sull'operatore ternario tratta ?: in sé.

L'operatore nullsafe ?->

?-> è la versione per gli oggetti della stessa idea, aggiunta in PHP 8. Se l'oggetto a sinistra è null, l'intera catena si ferma e restituisce null invece di lanciare un Error come Call to a member function getAddress() on null. Metti ?? alla fine per un valore predefinito.

L'utente 2 esiste ma non ha un indirizzo, e l'utente 3 non esiste affatto. Entrambi arrivano al valore predefinito ?? "unknown" senza errori.

Errore comune: ?? ha precedenza bassa

?? lega meno di . e degli operatori aritmetici. Quindi in "Count: " . $count ?? 0, PHP prima costruisce la stringa "Count: " . $count, che non è mai null, e il valore predefinito non viene mai usato.

Racchiudi l'espressione con ?? tra parentesi ogni volta che si trova dentro un'espressione più grande.

Domande frequenti

Cosa significa ?? in PHP?

?? è l'operatore di null coalescing. $a ?? $b restituisce $a se esiste e non è null, altrimenti $b. È la forma breve di isset($a) ? $a : $b e non solleva warning quando $a o una chiave di array non sono definiti.

Qual è la differenza tra ?? e ?: in PHP?

?? ripiega solo quando il lato sinistro è null o non impostato, quindi 0 ?? 5 vale 0 e '' ?? 'x' vale ''. ?: ripiega ogni volta che il lato sinistro è falsy, quindi 0 ?: 5 vale 5. ?: dà anche warning per variabili e chiavi non definite, ?? no.

Cosa fa ??= in PHP?

$a ??= $b assegna $b ad $a solo se $a è null o non impostata; altrimenti lascia $a com'è. È la forma breve di $a = $a ?? $b; ed è stato aggiunto in PHP 7.4.

Cos'è l'operatore nullsafe ?-> in PHP?

$obj?->method() chiama il metodo solo quando $obj non è null; se è null, l'intera catena restituisce null invece di lanciare un errore. Combinalo con ?? per un valore predefinito: $user?->getAddress()?->city ?? 'unknown'. È stato aggiunto in PHP 8.0.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA