Intro a PHP 8 cover image

Intro a PHP 8

alberto • January 24, 2021

PHP

In questo terzo appuntamento della rubrica su PHP 8 analizzeremo una feature molto attesa che migliora parecchio la leggibilità del codice ed evita spesso di cadere in errore.

Lo stato dell'arte

Grazie ai Named Arguments è possibile invocare funzioni o metodi passando argomenti non utilizzando una sintassi posizionale ma bensí sfruttando una sintassi nominale.

Facciamo subito un esempio. La funzione nativa set_cookie ha una definizione abbastanza prolissa:

setcookie ( 
    string $name, 
    string $value = "", 
    int $expires = 0, 
    string $path = "", 
    string $domain = "", 
    bool $secure = false, 
    bool $httponly = false 
) : bool

Questo principalmente perchè i cookie hanno diverse opzioni e la funzione rispecchia, più o meno, tutte queste possibilità.

Il problema di questo approccio risiede nel fatto che spesso siamo obbligati a passare i valori di default solamente perchè l'opzione che ci interessa è successiva ad altre che non vogliamo configurare.

Per esempio se volessimo impostare un cookie di nome "my-cookie", con valore "my-value", con durata di 1 ora e che sia disponibile solo tramite protocollo http, dovremmo scrivere:

set_cookie(
    'my-cookie',
    'my-value',
    time()+60*60*24,
    "",
    "",
    false,
    true
);

Le due stringhe vuote (rispettivamente $path e $domain) e il false relativo a $secure sono all'interno della funzione esclusivamente come placeholder per poter arrivare all'opzione $httponly.

Una sintassi non proprio amichevole...

Il nome degli argomenti

Grazie a questa nuova feature di PHP8 è possibile considerare l'insieme dei parametri come fossero una mappa chiave-valore, utilizzando il nome inserito in fase di definizione del metodo/funzione come chiave.

Questo ci permette di riscrivere l'invocazione a set_cookie precedente in questo modo:

set_cookie(
    name: 'my-cookie',
    value: 'my-value',
    httponly: true
);

Nettamente piú leggibile, no?

...ma c'è anche altro

I parametri nominali possono essere mischiati con quelli posizionali, a patto che i primi siano quelli senza riferimento:

set_cookie(
    'my-cookie',
    'my-value',
    httponly: true
);

La sintassi spreading è compatibile con i Named Arguments. Possiamo infatti trasformare un array associativo in una lista di parametri sfruttando la three dot syntax:

$input = [
    'name' => 'my-cookie',
    'value' => 'my-value',
    'httponly' => true
];
set_cookie(...$input);

Chiediamo scusa a set_cookie

set_cookie bisogna ammetterlo, ha una definizione pessima che si presta ad esempi di worst-practice come quelli fatti in questo articolo.

Ma, per essere intellettualmente onesti, bisogno anche citare che, da PHP 7.3.0 è stata introdotta una nuova definizione che permette di passare eventuali extra opzioni come array associativo (chiavi consentite expires, path, domain, secure, httponly e samesite):

setcookie (
    string $name, 
    string $value = "", 
    array $options = [] 
) : bool

Questa sintassi ha corretto, in parte, il problema dei parametri nullabili sin da prima del rilascio dei Named Arguments ma oggi risulta nei fatti già deprecata, proprio grazie a questa nuova caratteristica del linguaggio.

Laravello non mi basta, voglio saperne di più!

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