Menu

Funciones flecha en PHP: sintaxis fn() => y ejemplos

Una función flecha es una función anónima de una sola expresión que se escribe fn($x) => $x * 2. Usa automáticamente las variables de fuera, por valor, sin use. Aprende la sintaxis, cómo funciona la captura, los tipos, los callbacks para array_map y usort, y cuándo usar en su lugar un closure completo.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Una función flecha es una función anónima corta: fn($x) => $x * 2. El cuerpo tras => es una sola expresión cuyo valor se devuelve, y cualquier variable del código que la rodea que use la expresión se captura automáticamente, por valor. Las funciones flecha existen desde PHP 7.4 y se usan sobre todo como callbacks.

La sintaxis

fn, la lista de parámetros, => y una expresión. Los tipos de los parámetros, los valores por defecto y el tipo de retorno funcionan igual que en las funciones normales:

No hay palabra clave return ni llaves. Una expresión larga se puede repartir en varias líneas para que se lea mejor.

Las variables de fuera se capturan por valor

Una función flecha ve todas las variables del ámbito donde se crea. Copia sus valores en ese momento. Los cambios hechos dentro se quedan dentro, y los cambios hechos fuera después de crear la función no se ven:

Esta es la principal diferencia con function () use (&$count), que puede compartir una variable por referencia. Una función flecha no puede reasignar una variable de fuera. Sí puede cambiar un objeto que haya capturado (la copia es un manejador del mismo objeto), y un parámetro declarado por referencia funciona como en cualquier función: fn(array &$list) => $list[] = 'x'.

Callbacks para array_map, array_filter y usort

La mayoría de las funciones de arrays reciben un callback, y ahí es donde las funciones flecha ahorran más ruido. Compara un filtro escrito de las dos formas:

<=> devuelve -1, 0 o 1, justo lo que quiere usort(), así que ordenar por un campo cabe en una línea. Intercambia $a y $b para ordenar de forma descendente.

Funciones flecha que devuelven funciones flecha

Las variables capturadas incluyen los parámetros de una función flecha exterior, así que puedes anidarlas para construir funciones a partir de otros valores:

Fíjate en que array_filter() conserva las claves originales, y por eso el resultado empieza en el índice 1.

fn vs function: cuándo necesitas un closure completo

Las funciones flecha dejan de servir cuando el cuerpo necesita más de una expresión o debe cambiar una variable de fuera. Entonces usa una función anónima:

fn($x) => ...function ($x) use ($y) { ... }
Cuerpouna expresióncualquier sentencia
Retornoautomáticoreturn explícito
Variables de fueratodas las que usa, automáticamentesolo las listadas en use
Captura por referencianosí, use (&$y)
Disponible desdePHP 7.4PHP 5.3

Cuando una función flecha se queda corta, a menudo significa que el trabajo son dos trabajos. Dividirlo en un filtro y una suma, como arriba, mantiene cada callback en una sola expresión.

Preguntas frecuentes

¿Qué es una función flecha en PHP?

Una función anónima corta introducida en PHP 7.4: fn($x) => $x * 2. Su cuerpo es una sola expresión cuyo valor se devuelve automáticamente, y puede leer variables del ámbito que la rodea sin una cláusula use.

¿Una función flecha de PHP puede tener varias líneas?

No. El cuerpo tras => debe ser una sola expresión; no hay un bloque con sentencias. Puedes repartir una expresión larga en varias líneas, pero si necesitas if, bucles o varias sentencias, usa en su lugar function () use (...) { ... }.

¿Una función flecha puede modificar una variable de fuera?

No. Las funciones flecha capturan las variables de fuera por valor, así que fn() => $count++ solo cambia su propia copia y $count fuera se queda igual. Para modificar una variable de fuera, usa un closure con use (&$count).

¿Cuál es la diferencia entre fn y function en PHP?

fn($x) => ... contiene una expresión, la devuelve implícitamente y captura por valor cada variable de fuera que usa. function ($x) use ($y) { ... } puede contener cualquier sentencia, necesita un return explícito y solo ve las variables listadas en use, que pueden capturarse por referencia.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR