Nullsafe operator (?->): niente più if a cascata
Confronto con if/else, short-circuit, limitazioni
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.
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.
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.