Función Flecha
Las funciones flecha fueron introducidas en PHP 7.4 como sintaxis
más concisa para las
funciones anónimas.
Las funciones anónimas como las funciones flecha están implementadas utilizando la clase
Closure.
Las funciones flecha tienen la forma básica
fn (argument_list) => expr
.
Las funciones flecha soportan las mismas características que las
funciones anónimas,
excepto que el uso de variables del ámbito padre es automático.
Cuando una variable utilizada en la expresión está definida en el ámbito
padre, será capturada implícitamente por valor.
En el siguiente ejemplo, las funciones $fn1 y
$fn2 se comportan de manera idéntica.
Ejemplo #1 Las funciones flecha capturan variables por valor automáticamente
<?php
$y = 1;
$fn1 = fn($x) => $x + $y;
// equivalente a usar $y por valor:
$fn2 = function ($x) use ($y) {
return $x + $y;
};
var_export($fn1(3));
?>
El resultado del ejemplo sería:
Esto también funciona si las funciones flecha están anidadas:
Ejemplo #2 Las funciones flecha capturan variables por valor automáticamente, incluso anidadas
<?php
$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Muestra 51
var_export($fn(5)(10));
?>
Similar a las funciones anónimas,
la sintaxis de las funciones flecha permite firmas de función arbitrarias,
esto incluye tipos de parámetros y de retorno, valor por defecto, variable,
así como el paso y retorno por referencia.
Todos los siguientes ejemplos son funciones flecha válidas:
Ejemplo #3 Ejemplos de funciones flecha
<?php
fn(array $x) => $x;
static fn($x): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;
?>
Las funciones flecha vinculan variables por valor.
Esto es aproximadamente equivalente a hacer un use($x)
para
cada variable $x utilizada dentro de la función
flecha.
Un vínculo por valor significa que no es posible modificar un
valor del ámbito exterior.
Las funciones anónimas
pueden ser utilizadas en su lugar para vínculos por referencia.
Ejemplo #4
Valores del ámbito exterior no pueden ser modificados por funciones flecha
<?php
$x = 1;
$fn = fn() => $x++; // No tiene efecto
$fn();
var_export($x); // Muestra 1
?>