W3docs

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); // 16

Captura 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:

php— editable, runs on the server

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; // 7

Para 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 variablesAutomática, por valorExplícita mediante use
CuerpoExpresión únicaBloque de declaraciones completo
Palabra clave returnImplícitaRequerida
Captura por referenciaNoSí, con use (&$var)
Disponible desdePHP 7.4PHP 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.

Práctica

Práctica
¿Cuáles son las características de las funciones PHP según el artículo de la URL proporcionada?
¿Cuáles son las características de las funciones PHP según el artículo de la URL proporcionada?
Was this page helpful?