Le arrow Function
Le arrow function sono state introdotte in PHP 7.4 come sintassi più concisa per le
funzioni anonime.
Sia le funzioni anonime che le arrow function sono implementate usando la
classe Closure.
Le arrow function hanno la forma base
fn (argument_list) => expr
.
Le arrow function supportano le stesse funzionalità delle
funzioni anonime,
eccetto che l'uso delle variabili dallo scope padre è sempre automatico.
Quando una variabile usata nell'espressione è definita nello scope padre
essa sarà implicitamente catturata per valore.
Nel seguente esempio, le funzioni $fn1 e
$fn2 si comportano allo stesso modo.
Example #1 Le arrow function catturano variabili per valore automaticamente
<?php
$y = 1;
$fn1 = fn($x) => $x + $y;
// equivalent all'utilizzo di $y per valore:
$fn2 = function ($x) use ($y) {
return $x + $y;
};
var_export($fn1(3));
?>
Il precedente esempio visualizzerà:
Questo funziona anche se le arrow function sono nidificate:
Example #2 Le arrow function catturano variabili per valore automaticamente, anche quando nidificate
<?php
$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Produce 51
var_export($fn(5)(10));
?>
Analogamente alle funzioni anonime,
la sintassi delle arrow function permette firme di funzioni arbitrarie,
inclusi parametri e tipi di ritorno, valori di default, variadiche,
così come passaggio di parametri e ritorno per riferimento.
Tutti i seguenti sono esempi validi di arrow function:
Example #3 Esempi di arrow function
<?php
fn(array $x) => $x;
static fn(): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;
?>
Le arrow function usano il binding della variabili per valore.
Questo è grossomodo equivalente ad eseguire uno use($x)
per ogni
variabile $x usata all'interno della arrow function.
Un binding per valore significa che non è possibile modificare qualsiasi valore
dallo scope esterno.
Le funzioni anonime
possono invece essere usate per il binding per riferimento.
Example #4 I valori dello scope esterno non possono essere modificati dalle arrow function
<?php
$x = 1;
$fn = fn() => $x++; // Non ha effetto
$fn();
var_export($x); // Produce 1
?>