?? 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 _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.