Blog de Gonzalo

FUNCIONES ARROW EN PHP

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.

Compartir en twitter