Una de las novedades de versión 7.4 de php son las funciones arrow, también conocidas como short closures y son una forma más simplificada de escribir funciones anónimas, o closures.Las funciones arrow en php hacen que el código sea más legible.
Las funciones arrow se puede usar el cualquier lugar donde se usen las funciones anónimas.
Normas:
- Solo pueden tener una línea de código (puede que esto cambie en el futuro).
- No se pueden usar las llaves {}.
- La expresión no lleva ";" al final.
- No se usa return.
También hay que tener en cuenta:
- No se necesita el use para poder acceder a variables externas como en las funciones anónimas.
- Se puede seguir accediendo a $this, igual que en los closures.
- Se puede indicar el tipo de datos tanto en los parámetros como en la respuesta.
Ejemplo de especificacioón del tipo de dato (type hintinig):
fn( array $producto) : float => $producto['precio'] * $producto['impuesto']
Hay que tener cuidado con la precedencia
fn($x) :int => $x + $y
//es igual a
fn($x) :int => ( $x + $y )
//pero no es igual a
(fn($x) :int => $x ) + $y
Ejemplo con funciones arrow
$productos = [
[
'id' => 1,
'nombre' => 'Producto 1',
'precio' => 35.40,
'impuesto' => 1.21,
],
[
'id' => 2,
'nombre' => 'Producto 2',
'precio' => 50.10,
'impuesto' => 1.10,
],
[
'id' => 3,
'nombre' => 'Producto 3',
'precio' => 14.85,
'impuesto' => 1.21,
],
];
$impuesto = 1.21;
$productosConImpuesto21 = array_filter($productos, fn($producto) => $producto['impuesto'] == $impuesto);
$precios = array_map(fn($producto) => $producto['precio'] * $producto['impuesto'], $productosConImpuesto21);
$total = array_sum($precios);
echo 'Total:'. $total;
Ejemplo con funciones anonimas
$productos = [
[
'id' => 1,
'nombre' => 'Producto 1',
'precio' => 35.40,
'impuesto' => 1.21,
],
[
'id' => 2,
'nombre' => 'Producto 2',
'precio' => 50.10,
'impuesto' => 1.10,
],
[
'id' => 3,
'nombre' => 'Producto 3',
'precio' => 14.85,
'impuesto' => 1.21,
],
];
$impuesto = 1.21;
$productosConImpuesto21 = array_filter($productos, function($producto) use ($impuesto) { return $producto['impuesto'] == $impuesto; });
$precios = array_map(function($producto) { return $producto['precio'] * $producto['impuesto']; }, $productosConImpuesto21);
$total = array_sum($precios);
echo 'Total:'. $total;
La verdad es que el código del ejemplo con las funciones arrow es más sencillo y legible.