W3docs

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); // 16

Cattura 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:

php— editable, runs on the server

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; // 7

Per 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 variabiliAutomatica, per valoreEsplicita tramite use
CorpoEspressione singolaBlocco di istruzioni completo
Parola chiave returnImplicitaObbligatoria
Cattura per riferimentoNoSì, con use (&$var)
Disponibile daPHP 7.4PHP 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.

Pratica

Pratica
Quali sono le caratteristiche delle funzioni PHP indicate nell'articolo all'URL fornito?
Quali sono le caratteristiche delle funzioni PHP indicate nell'articolo all'URL fornito?
Was this page helpful?