Lo nuevo de PHP 7.4: Las funciones «arrow» (arrow functions)

Las funciones arrow (también llamadas «short closures«) se han creado para hacer feliz a ese perezoso que todos llevamos dentro. Son simplemente una forma más corta de escribir funciones anónimas (o closures).

Es una nueva característica de PHP7.4 y, en realidad, no se han hecho por vagancia sino para hacer el código más legible.

Formato de las arrow functions

Este tipo de funciones para vagos tiene este formato:

fn(parametros) => expresión;

Un sencillo ejemplo

Qué mejor para entender algo que verlo en acción. Te dejo aquí un sencillo ejemplo para que lo veas. Partimos de un array de productos y queremos sumar el total de los productos con un impuesto del 21% (1.21).

Primero filtramos el array para quedarnos con los productos que cumplen con la condición del 21% (usando array_fitler). Lo siguiente será crear un nuevo array en el que solo tendremos los precios con el impuesto ya sumado (usando array_map). Como último paso sumamos los elementos del array de precios para calcular el total (usando array_sum).

Nota: Sí, quizá un foreach hubiera sido una opción más válida, pero aquí estamos viendo ejemplos de las funciones «flecha».

<?php

$productos = [
    [
        'id' => 1,
        'nombre' => 'Sombrero de copa',
        'precio' => 50.00,
        'impuesto' => 1.21,
    ],
    [
        'id' => 2,
        'nombre' => 'Monóculo',
        'precio' => 40.00,
        'impuesto' => 1.10,
    ],
    [
        'id' => 3,
        'nombre' => 'Bastón-sable',
        'precio' => 140.00,
        'impuesto' => 1.21,
    ],
];

$impuesto21 = 1.21;

$productosConImpuesto21 = array_filter($productos, fn($producto) => $producto['impuesto'] == $impuesto21);
$precios = array_map(fn($producto) => $producto['precio'] * $producto['impuesto'], $productosConImpuesto21);
$total = array_sum($precios);

echo "Total: $total";

Comparación con las funciones anónimas

Para ver la diferencia con respecto a las funciones anónimas te dejo aquí el mismo código en versión «antigua»:

$impuesto21 = 1.21;

$productosConImpuesto21 = array_filter($productos, function($producto) use ($impuesto21) { return $producto['impuesto'] == $impuesto21; });
$precios = array_map(function($producto) { return $producto['precio'] * $producto['impuesto']; }, $productosConImpuesto21);
$total = array_sum($precios);

echo "Total: $total";

Dónde se pueden usar los short closures

Este nuevo tipo de función abreviada se puede usar el cualquier lugar donde uses funciones anónimas.

Algunas características importantes

Se deben respetar algunas normas para usar este tipo de funciones:

  • 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.

Por otro lado hay que tener en cuenta que:

  • No necesitas el «use» para poder acceder a variables externas (como sí sucede en las funciones anónimas).
  • Seguimos teniendo acceso a $this, igual que en los closures «normales».
  • Podemos indicar tipos de datos tanto en los parámetros como en la respuesta (ver abajo).

Tipos de datos (type hintinig)

fn( array $producto) : float => $producto[‘precio’] * $producto[‘impuesto’]

Precedencia

Ojo, que si hacemos esto:

fn($x) :int => $x + $y

Es equivalente a:

fn($x) :int => ( $x + $y )

y no a:

(fn($x) :int => $x ) + $y

Más información

Ver: https://wiki.php.net/rfc/arrow_functions_v2

Me siento solo, dime algo...