php Beginner 3 min

Nullsafe operator (?->): niente più if a cascata

Confronto con if/else, short-circuit, limitazioni

· 541 parole

Prima di PHP 8, navigare oggetti che potevano essere null a ogni passo significava scrivere un if per ciascun passo: una piramide di controlli annidati solo per leggere un valore in fondo alla catena. Il nullsafe operator (?->) risolve esattamente questo, in una sola riga.

Immagina di chiedere indicazioni per raggiungere un ufficio in fondo a un palazzo: «se il portone è aperto, e se l'ascensore funziona, e se la porta del piano è aperta, allora entra». Con il nullsafe operator, basta dire una volta «prova ad arrivarci; se una qualsiasi porta lungo il percorso è chiusa, fermati e basta», senza dover controllare ogni porta a voce alta.

1. Confronto con if/else: lo stesso risultato, molto meno codice

Il manuale ufficiale PHP mostra l'equivalenza esatta. Questa riga:

$result = $repository?->getUser(5)?->name;

è esattamente equivalente a questo blocco, secondo la documentazione:

if (is_null($repository)) { 
    $result = null; 
} else { 
    $user = $repository->getUser(5); 
}

if (is_null($user)) { 
    $result = null; 
} else { 
    $result = $user->name; 
} 

L'operatore ?-> funziona come il normale ->, con un'unica differenza: se l'oggetto a sinistra è null, restituisce null invece di lanciare un errore.

Fonte: PHP Manual: «The Basics» (language.oop5.basic.php): esempio ufficiale dell'equivalenza tra nullsafe operator e blocco if/else annidato.

2. Short-circuit: l'intera catena si ferma al primo null

Il vero vantaggio emerge con catene più lunghe. Basta un solo ?-> nel punto giusto: appena PHP incontra null, interrompe subito il resto della valutazione: non prova a chiamare i metodi successivi, restituisce null e basta.

$longitudine = $cliente->getIndirizzo()?->getCoordinate()->getLongitudine(); 
// Se getIndirizzo() restituisce null: 
// PHP si ferma subito, non prova a chiamare getCoordinate() 
// $longitudine sara' semplicemente null

Un percorso a tappe in cui, appena una tappa risulta annullata, tutte le tappe successive vengono automaticamente cancellate senza bisogno di disdirle una per una: basta il primo «annullato» per fermare tutto il resto del viaggio.

3. Le limitazioni da conoscere

  • Solo lettura: non puoi usare ?-> per scrivere un valore. Tentarlo genera un errore fatale: «Can't use nullsafe operator in write context».
$utente?->indirizzo = 'Roma'; // Fatal error: Can't use nullsafe operator in write context
  • Va ripetuto a ogni passo che potrebbe essere nullo: usarlo una sola volta nella catena non rende automaticamente «sicuri» i passi successivi collegati con -> normale.
  • Non sostituisce i controlli di esistenza: se chiami un metodo che semplicemente non esiste sulla classe, resta comunque un errore fatale: il nullsafe operator gestisce solo il caso «l'oggetto è null», non «il metodo non c'è».

Un'ultima regola pratica, dal manuale: usalo quando null è un valore valido e atteso per quella proprietà o quel metodo, non come scorciatoia generica per ignorare ogni possibile errore.

In sintesi

Aspetto Comportamento Nota
Sintassi ?-> al posto di -> in ogni punto della catena Stesso comportamento di ->, tranne su null
Se è null Restituisce null, nessun errore lanciato Al posto di un Fatal error / TypeError
Short-circuit L'intera catena si interrompe al primo null Le chiamate successive non vengono eseguite
Scrittura Non consentita: solo lettura Fatal error in write context

Il nullsafe operator non elimina la necessità di pensare a null: la rende solo molto più facile da scrivere e da leggere, sostituendo una piramide di controlli con un'unica catena chiara.

php php 8.1 php 8.4
Accedi o registrati per votare, salvare o commentare la pillola

Commenti (0)

Registrati per commentare, fare domande e proporre l'argomento della prossima pillola (oppure accedi se hai già un account).

Nessun commento. Sii il primo a scrivere qualcosa.

Pillole correlate