Intro a PHP 8 cover image

Intro a PHP 8

alberto • October 18, 2020

PHP

Iniziamo con questo articolo una serie di post riguardanti la prossima release di PHP che dovrebbe vedere la luce entro il 2020. In questo primo approfondimento ci occuperemo dei Nullsafe Method, una manna dal cielo per gli sviluppatori.

Null Pointer, ci siamo caduti tutti

Uno degli errori più comuni nella programmazione moderna, e non solo, solo i Null Pointer. Essi rappresentano una tipologia di errori che vengono scatenati quando si cerca di accedere ad una proprietà o di invocare un metodo su un oggetto non valorizzato. Il puntatore di questo oggetto fa appunto riferimento ad un valore null: da qui il nome di Null Pointer.

Guardiamo un esempio:

$productCategoryName = Product::find(1)->category->parentCategory->name

Questa porzione di codice, seppur semplice, presenta diversi punti di rottura. Cosa succederebbe se l'utente con id 1 non esistesse? O se non avesse una category associata? O se questa category non avesse un parent? In tutto questi casi otterremmo un errore.

Un metodo safe per approcciare uno script del genere potrebbe essere questo:

$parentCategoryName = null;
$product = Product::find(1);
if($product) {
    $category = $product->category;
    if($category) {
        $parentCategory = $category->parentCategory;
        if($parentCategory) {
            $parentCategoryName = $parentCategory->name;
        }
    }
}

Efficace si, ma alquanto bruttino da leggere e da manutenere.

Nullsafe method, ovvero l'arte del fregarsene

È proprio in questo scenario che i null safe Method dettano legge. Grazie ad un nuovo operatore alquanto particolare ma eloquente (?->) possiamo accedere ad una proprietà o invocare un metodo non preoccupandoci se l'oggetto di partenza sia o meno null.

$productCategoryName = Product::find(1)?->category?->parentCategory?->name

Grazie a questa nuova sintassi, deleghiamo all'interprete PHP il controllo sulla nullabilità dell'oggetto target.

Cerchiamo di capire meglio come funziona internamente: - viene invocato il metodo statico find della classe Product - se l'oggetto è null, viene ritornato null - altrimenti viene letta la properti category - se la category è null, viene ritornato null - altrimenti viene letta la property parentCategory - se la parentCategory è null, viene ritornato null - altrimenti viene ritornato il name

Ottimo, esattamente quello che avevamo scritto nella porzione di codice precedente!

Laravello non mi basta, voglio saperne di più!

Bene, a questo indirizzo l'RFC ufficiale e a questo la PR su github.