fn
La palabra clave "fn" de PHP 7.4 permite crear funciones flecha: una sintaxis concisa para expresiones únicas con captura automática de variables.
La palabra clave fn de PHP (funciones flecha)
La palabra clave fn, introducida en PHP 7.4, crea funciones flecha — una sintaxis concisa para escribir funciones anónimas de una sola expresión. Una función flecha devuelve el valor de una expresión y captura automáticamente las variables que utiliza del ámbito circundante. Esto la hace ideal para callbacks cortos pasados a funciones de array como array_map, array_filter y array_reduce.
Esta página cubre la sintaxis, cómo difiere la captura de variables respecto a los closures clásicos, las reglas principales y los puntos a tener en cuenta, y ejemplos prácticos.
Sintaxis
Una función flecha utiliza fn, una lista de parámetros, el operador => (fat arrow) y una expresión única cuyo valor se devuelve de forma implícita:
$arrowFunction = fn($parameter) => expression;No hay cuerpo { ... } ni declaración return — ambos están prohibidos. La expresión tras => es el valor de retorno.
$square = fn($n) => $n * $n;
echo $square(4); // 16Captura automática de variables (sin necesidad de use)
La mayor diferencia respecto a un closure clásico (function () use (...) { ... }) es que una función flecha captura automáticamente por valor cada variable del ámbito padre a la que hace referencia. Nunca es necesario escribir una cláusula use:
Dado que la captura es solo por valor, las funciones flecha no pueden modificar una variable externa por referencia. Si necesitas eso, utiliza un closure completo con use (&$var).
Ejemplos
Las funciones flecha destacan como callbacks de una sola línea. La expresión se devuelve automáticamente, por lo que no se necesita return.
<?php
// array_reduce — sum a list
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, fn($carry, $number) => $carry + $number);
echo $sum . PHP_EOL; // 15
// array_filter — keep names longer than 4 characters
$names = ["John", "Maryjane", "Paul", "Jane"];
$filtered = array_filter($names, fn($name) => strlen($name) > 4);
print_r($filtered); // Array ( [1] => Maryjane )
// array_map — apply 20% tax to each price
$prices = [10, 20, 30];
$withTax = array_map(fn($p) => $p * 1.2, $prices);
print_r($withTax); // Array ( [0] => 12 [1] => 24 [2] => 36 )
// Nested arrow functions (currying) — each captures from its parent
$adder = fn($x) => fn($y) => $x + $y;
echo $adder(3)(4) . PHP_EOL; // 7Para más información sobre cómo pasar funciones como callbacks, consulta funciones callback de PHP.
Reglas y puntos a tener en cuenta
- Una sola expresión. Las funciones flecha no pueden contener declaraciones, bucles ni múltiples líneas. Si tu lógica necesita un bloque, usa un closure completo con
function () use (...) { ... }. - La captura es por valor. Modificar una variable capturada dentro de la función flecha no afecta a la externa, y los cambios posteriores en la variable externa no se reflejan.
- Sin captura por referencia. No puedes usar
use (&$var); recurre a un closure completo cuando necesites mutar estado externo. - Se permiten indicaciones de tipo y valores por defecto:
fn(int $n = 0): int => $n + 1. - Solo PHP 7.4+. En versiones anteriores, vuelve a usar
function () use (...) { ... }.
fn vs. function (closures)
Función flecha (fn) | Closure (function) | |
|---|---|---|
| Captura de variables | Automática, por valor | Explícita mediante use |
| Cuerpo | Expresión única | Bloque de declaraciones completo |
Palabra clave return | Implícita | Requerida |
| Captura por referencia | No | Sí, con use (&$var) |
| Disponible desde | PHP 7.4 | PHP 5.3 |
Usa fn cuando tengas un callback corto de expresión única. Usa un closure completo cuando necesites múltiples declaraciones, captura por referencia o quieras ser explícito sobre lo que capturas.
Véase también: funciones PHP · ámbito de variables.