Una arrow function è una breve funzione anonima: fn($x) => $x * 2. Il corpo dopo => è una singola espressione il cui valore viene restituito, e ogni variabile del codice circostante usata dall'espressione viene catturata automaticamente, per valore. Le arrow function esistono da PHP 7.4 e si usano soprattutto come callback.
La sintassi
fn, la lista dei parametri, =>, un'espressione. I tipi dei parametri, i valori di default e il tipo restituito funzionano come nelle funzioni normali:
Non c'è la parola chiave return e non ci sono graffe. Un'espressione lunga si può comunque dividere su più righe per leggibilità.
Le variabili esterne vengono catturate per valore
Una arrow function vede ogni variabile dello scope in cui viene creata. Ne copia i valori in quel momento. Le modifiche fatte dentro restano dentro, e le modifiche fatte fuori dopo la creazione della funzione non vengono viste:
È la differenza principale rispetto a function () use (&$count), che può condividere una variabile per riferimento. Una arrow function non può riassegnare una variabile esterna. Può comunque modificare un oggetto che ha catturato (la copia è un riferimento allo stesso oggetto), e un parametro dichiarato per riferimento funziona come in qualsiasi funzione: fn(array &$list) => $list[] = 'x'.
Callback per array_map, array_filter e usort
La maggior parte delle funzioni per array accetta una callback, ed è lì che le arrow function eliminano più rumore. Confronta lo stesso filtro scritto nei due modi:
<=> restituisce -1, 0 o 1, esattamente ciò che vuole usort(), quindi ordinare per un campo sta in una riga. Scambia $a e $b per l'ordine decrescente.
Arrow function che restituiscono arrow function
Le variabili catturate includono i parametri di una arrow function che la contiene, quindi puoi annidarle per costruire funzioni a partire da altri valori:
Nota che array_filter() mantiene le chiavi originali, ed è per questo che il risultato parte dall'indice 1.
fn vs function: quando serve una closure completa
Le arrow function smettono di funzionare quando il corpo richiede più di un'espressione o deve modificare una variabile esterna. Allora usa una funzione anonima:
fn($x) => ... | function ($x) use ($y) { ... } | |
|---|---|---|
| Corpo | un'espressione | qualsiasi istruzione |
| Return | automatico | return esplicito |
| Variabili esterne | tutte quelle usate, automaticamente | solo quelle elencate in use |
| Cattura per riferimento | no | sì, use (&$y) |
| Disponibile da | PHP 7.4 | PHP 5.3 |
Quando una arrow function sembra stretta, spesso significa che il lavoro è in realtà due lavori. Dividerlo in un filtro e una somma, come sopra, mantiene ogni callback una singola espressione.
Domande frequenti
Cos'è una arrow function in PHP?
Una breve funzione anonima introdotta in PHP 7.4: fn($x) => $x * 2. Il suo corpo è una singola espressione il cui valore viene restituito automaticamente, e può leggere le variabili dello scope circostante senza una clausola use.
Una arrow function PHP può avere più righe?
No. Il corpo dopo => deve essere una sola espressione; non c'è un blocco con istruzioni. Puoi dividere un'espressione lunga su più righe, ma se ti servono if, cicli o più istruzioni, usa invece function () use (...) { ... }.
Una arrow function può modificare una variabile esterna?
No. Le arrow function catturano le variabili esterne per valore, quindi fn() => $count++ modifica solo la propria copia e $count fuori resta uguale. Per modificare una variabile esterna, usa una closure con use (&$count).
Qual è la differenza tra fn e function in PHP?
fn($x) => ... contiene una sola espressione, la restituisce implicitamente e cattura per valore ogni variabile esterna che usa. function ($x) use ($y) { ... } può contenere qualsiasi istruzione, richiede un return esplicito e vede solo le variabili elencate in use, che possono essere catturate per riferimento.