Funciones anónimas y closures
Funciones sin nombre, captura de variables externas, y la sintaxis compacta de las funciones flecha.
2 min de lectura
PHP trata las funciones como valores que puedes almacenar en una variable, pasar como argumento, o devolver desde otra función — empezando por las funciones anónimas.
Funciones anónimas
<?php
$greet = function ($name) {
return "Hello, $name!";
};
echo $greet("Amara");Una función anónima (también llamada closure) no tiene nombre propio — se asigna directamente a una variable, que luego se llama igual que una función con nombre. Esta es la forma que adoptan la mayoría de los callbacks pasados a funciones como array_map() o usort().
Capturar variables externas con use
<?php
$taxRate = 0.08;
$addTax = function ($price) use ($taxRate) {
return $price * (1 + $taxRate);
};
echo $addTax(100); // 108Por defecto, una función anónima no puede ver las variables del ámbito circundante — use ($taxRate) la importa explícitamente. Sin use, referenciar $taxRate dentro del closure provocaría un aviso de "variable no definida", aunque claramente exista justo fuera.
Capturar por referencia
<?php
$total = 0;
$addToTotal = function ($amount) use (&$total) {
$total += $amount;
};
$addToTotal(10);
$addToTotal(25);
echo $total; // 35use (&$total) captura $total por referencia en lugar de por valor — los cambios realizados dentro del closure persisten en la variable externa después de que el closure retorne. Sin el &, cada llamada modificaría su propia copia privada, y el $total externo seguiría siendo 0.
Funciones flecha: una sintaxis más corta
<?php
$taxRate = 0.08;
$addTax = fn($price) => $price * (1 + $taxRate);
echo $addTax(100); // 108Las funciones flecha (fn(...) => expresión) capturan automáticamente cualquier variable externa que referencien — sin necesitar use — pero se limitan a una única expresión, cuyo resultado se devuelve implícitamente. Son adecuadas para los callbacks cortos, de una línea, que se pasan a array_map(), array_filter() y funciones similares; recurre a una función anónima completa cuando la lógica necesite más de una sentencia.
Pasar un closure como callback
<?php
$numbers = [5, 3, 8, 1];
usort($numbers, fn($a, $b) => $a <=> $b);
print_r($numbers); // [1, 3, 5, 8]usort() ordena un array usando una función de comparación personalizada — aquí, el operador nave espacial <=> devuelve -1, 0 o 1 según si $a es menor, igual o mayor que $b, que es exactamente lo que se espera que devuelva un callback de comparación. Este patrón — una función integrada que recibe un closure para personalizar su comportamiento — está por todas partes en la biblioteca estándar de PHP.
Pon a prueba lo que acabas de aprender
4 preguntas rápidas. Respóndelas todas correctamente para desbloquear la siguiente lección.
Puedes hacer el cuestionario sin una cuenta — iniciar sesión solo hace que tu resultado cuente para tu progreso.