Una función anónima es una función sin nombre que puedes almacenar en una variable o pasar como argumento.
Hasta ahora, siempre hemos dado un nombre a nuestras funciones: function sumar().
Pero, ¿qué pasa si necesitas una función pequeña solo para usarla una vez dentro de un array_map? ¿O si quieres guardar una lógica dentro de una variable para ejecutarla más tarde?
Bienvenido al mundo de las Funciones Anónimas (o Closures) y las Arrow Functions.
¿Cuándo usar cada una?
| Característica | Función Anónima (function) | Arrow Function (fn) |
|---|---|---|
| Líneas de código | Permite múltiples líneas y lógica compleja. | Solo una expresión (una línea). |
| Return | Necesitas escribir return. | El return es implícito. |
| Variables externas | Necesitas use ($var). | Captura automática por valor. |
| Uso ideal | Lógica compleja, bloques grandes. | array_map, filter, callbacks rápidos. |
Funciones anónimas (closures)
Como su nombre indica, son funciones que no tienen nombre. Se asignan a una variable o se pasan directamente como argumento a otra función.
// Asignamos la función a una variable
$saludo = function($nombre) {
return "Hola $nombre";
}; // ¡Ojo! Lleva punto y coma al final porque es una asignación.
// La ejecutamos usando la variable
echo $saludo("Luis");El problema del alcance (scope) y use
Recuerda lo que dijimos: las funciones en PHP son muros de hormigón. No ven lo que hay fuera.
Si quieres usar una variable externa dentro de una función anónima, tienes que “importarla” explícitamente usando la palabra clave use. A esto se le llama Closure (Cierre).
$impuesto = 0.21;
// Si intentas usar $impuesto dentro sin 'use', fallará.
$calculadora = function($precio) use ($impuesto) {
return $precio * (1 + $impuesto);
};
echo $calculadora(100); // 121Esto funciona, pero… es un poco verboso, ¿verdad? function, return, use, llaves… demasiada sintaxis para una simple multiplicación.
Arrow functions (funciones flecha fn)
Para solucionar esa verbosidad, PHP 7.4 introdujo las Arrow Functions. Son la forma corta y limpia de escribir funciones anónimas.
Tienen dos características principales:
- Sintaxis ultracorta: Empiezan por
fn, usan una flecha=>y retornan automáticamente el valor de la expresión (no necesitas escribirreturn). - Captura automática de variables: ¡No necesitas
use! Las Arrow Functions pueden leer las variables de fuera automáticamente (por valor).
Miremos el mismo ejemplo anterior:
$impuesto = 0.21;
// Versión Arrow Function
$calculadora = fn($precio) => $precio * (1 + $impuesto);
echo $calculadora(100);¡Es una sola línea! Limpio, legible y potente.
El caso de uso real: limpiando arrays
Donde realmente brillan las Arrow Functions es combinándolas con las funciones de arrays que vimos en la lección anterior.
Imagina que tienes una lista de productos y quieres filtrar los caros.
Estilo Antiguo (Verboso):
$filtro = array_filter($productos, function($p) {
return $p['precio'] > 100;
});Con una arrow function:
$filtro = array_filter($productos, fn($p) => $p['precio'] > 100);La diferencia de legibilidad es abismal. El código moderno se lee casi como una frase: “Filtra productos donde precio sea mayor que 100”.
First-Class citizens (funciones como datos)
Un concepto avanzado pero importante: en PHP, las funciones son “ciudadanos de primera clase”. Esto significa que puedes pasar una función como si fuera un número o un string.
function procesar(array $datos, callable $operacion) {
foreach ($datos as $dato) {
$operacion($dato); // Ejecutamos la función que nos han pasado
}
}
// Pasamos una Arrow Function como argumento
procesar([1, 2, 3], fn($n) => print "Número: $n \n");El tipo callable en los argumentos asegura que lo que nos pasan es ejecutable.