
Intro a PHP 8
alberto • January 24, 2021
PHPIn 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.