fn
La parola chiave "fn" introdotta in PHP 7.4 permette di creare arrow function, una sintassi concisa per funzioni a espressione singola.
La parola chiave PHP fn (Arrow Function)
La parola chiave fn, introdotta in PHP 7.4, crea le arrow function — una sintassi concisa per scrivere funzioni anonime a espressione singola. Un'arrow function restituisce il valore di un'unica espressione e cattura automaticamente le variabili che utilizza dall'ambito circostante. Questo la rende ideale per i callback brevi passati a funzioni su array come array_map, array_filter e array_reduce.
Questa pagina tratta la sintassi, come la cattura delle variabili differisce dalle closure classiche, le principali regole e le insidie, oltre ad esempi pratici.
Sintassi
Un'arrow function utilizza fn, un elenco di parametri, l'operatore => (fat arrow) e una singola espressione il cui valore viene restituito implicitamente:
$arrowFunction = fn($parameter) => expression;Non esiste un corpo { ... } né un'istruzione return — entrambi sono vietati. L'espressione dopo => è il valore restituito.
$square = fn($n) => $n * $n;
echo $square(4); // 16Cattura automatica delle variabili (senza use)
La differenza principale rispetto a una closure classica (function () use (...) { ... }) è che un'arrow function cattura automaticamente per valore ogni variabile dell'ambito padre a cui fa riferimento. Non è mai necessario scrivere una clausola use:
Poiché la cattura avviene solo per valore, le arrow function non possono modificare una variabile esterna per riferimento. Se hai bisogno di ciò, usa una closure completa con use (&$var).
Esempi
Le arrow function eccellono come callback su una riga. L'espressione viene restituita automaticamente, quindi non è necessario alcun return.
<?php
// array_reduce — sum a list
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, fn($carry, $number) => $carry + $number);
echo $sum . PHP_EOL; // 15
// array_filter — keep names longer than 4 characters
$names = ["John", "Maryjane", "Paul", "Jane"];
$filtered = array_filter($names, fn($name) => strlen($name) > 4);
print_r($filtered); // Array ( [1] => Maryjane )
// array_map — apply 20% tax to each price
$prices = [10, 20, 30];
$withTax = array_map(fn($p) => $p * 1.2, $prices);
print_r($withTax); // Array ( [0] => 12 [1] => 24 [2] => 36 )
// Nested arrow functions (currying) — each captures from its parent
$adder = fn($x) => fn($y) => $x + $y;
echo $adder(3)(4) . PHP_EOL; // 7Per ulteriori informazioni sul passaggio di funzioni come callback, consulta le funzioni callback PHP.
Regole e insidie
- Una sola espressione. Le arrow function non possono contenere istruzioni, cicli o più righe. Se la logica richiede un blocco, usa una closure completa con
function () use (...) { ... }. - La cattura avviene per valore. Modificare una variabile catturata all'interno dell'arrow function non influisce su quella esterna, e le modifiche successive alla variabile esterna non vengono rilevate.
- Nessuna cattura per riferimento. Non è possibile usare
use (&$var); ricorri a una closure completa quando devi mutare lo stato esterno. - Type hint e valori predefiniti sono consentiti:
fn(int $n = 0): int => $n + 1. - Solo PHP 7.4+. Nelle versioni più vecchie, usa
function () use (...) { ... }.
fn vs. function (closure)
Arrow function (fn) | Closure (function) | |
|---|---|---|
| Cattura delle variabili | Automatica, per valore | Esplicita tramite use |
| Corpo | Espressione singola | Blocco di istruzioni completo |
Parola chiave return | Implicita | Obbligatoria |
| Cattura per riferimento | No | Sì, con use (&$var) |
| Disponibile da | PHP 7.4 | PHP 5.3 |
Scegli fn quando hai un callback breve a espressione singola. Usa una closure completa quando hai bisogno di più istruzioni, cattura per riferimento o vuoi essere esplicito su ciò che catturi.
Vedi anche: funzioni PHP · scope delle variabili.