Funciones de flecha
Las funciones de flecha fueron introducidas en PHP 7.4 como una sintaxis más concisa para
las funciones anónimas.
Tanto las funciones anónimas como las funciones de flecha se implementan utilizando la
clase Closure.
Las funciones de las flechas tienen la forma básica
fn (argument_list) => expr
.
Las funciones de las flechas soportan las mismas características que
las funciones anónimas,
excepto que el uso de variables del ámbito padre siempre es automático.
Cuando una variable utilizada en la expresión se define en el ámbito padre
será implícitamente capturada por valor.
En el siguiente ejemplo, las funciones $fn1 y
$fn2 se comportan de la misma manera.
Ejemplo #1 Las funciones de flecha capturan las variables por valor automáticamente
<?php
$y = 1;
$fn1 = fn($x) => $x + $y;
// equivalent to using $y by value:
$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 de la flecha están anidadas:
Ejemplo #2 Las funciones de flecha capturan variables por valor automáticamente, incluso cuando están anidadas
<?php
$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Outputs 51
var_export($fn(5)(10));
?>
De manera similar a las funciones anónimas,
la sintaxis de la función de la flecha permite firmas de funciones arbitrarias,
incluyendo los tipos de parámetros y de retorno, valores por defecto, variadades,
así como por referencia al pasar y al regresar.
Todos los siguientes son ejemplos válidos de las funciones de las flechas:
Ejemplo #3 Ejemplos de funciones de flecha
<?php
fn(array $x) => $x;
static fn(): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;
?>
Las funciones de flecha utilizan la unión variable por valor.
Esto es aproximadamente equivalente a realizar un use($x)
para cada
variable $x usada dentro de la función de la flecha.
Una unión por valores significa que no es posible modificar ningún valor
desde el ámbito exterior.
Funciones anónimas
se pueden utilizar en su lugar para las asignaciones por referencia.
Ejemplo #4 Los valores del alcance exterior no pueden ser modificados por las funciones de flecha
<?php
$x = 1;
$fn = fn() => $x++; // No tiene ningún efecto
$fn();
var_export($x); // Salida 1
?>