Funciones
PHP Manual

Funciones anónimas

Las funciones anónimas, también conocidas como clausuras (closures), permiten la creación de funciones que no tienen un nombre especificado. Son más útiles como valor de los parámetros de llamadas de retorno, pero tienen muchos otros usos.

Ejemplo #1 Ejemplo de función anónima

<?php
echo preg_replace_callback('~-([a-z])~', function ($coincidencia) {
    return 
strtoupper($coincidencia[1]);
}, 
'hola-mundo');
// imprime holaMundo
?>

Las clausuras también se pueden usar como valores de variables; PHP automáticamente convierte tales expresiones en instancias de la clase interna Closure. Se asume que una clausura a una variable usa la misma sintaxis que cualquier otra asignación, incluido el punto y coma final:

Ejemplo #2 Ejemplo de asignación de variable de una función anónima

<?php
$saludo 
= function($nombre)
{
    
printf("Hola %s\r\n"$nombre);
};

$saludo('Mundo');
$saludo('PHP');
?>

Las clausuras también pueden heredar variables del ámbito padre. Cualquier variable de estas debe ser declarada en la cabecera de la función. Heredar variables del ámbito padre no es lo mismo que usar variables globales. Las variables globales existen en el ámbito global, lo que implica que no importa qué función se esté ejecutando. El ámbito padre de una clausura es la función en la que la clausura fue declarado (no necesariamente la función desde la que se llamó). Vea el siguiente ejemplo:

Ejemplo #3 Clausuras y ámbito

<?php
// Un carro de compras básico que contiene una lista de productos añadidos
// y la cantidad de cada producto. Incluye un método que
// calcula el precio total de los artículos del carro usando una
// clausura como llamada de retorno.
class Carro
{
    const 
PRECIO_MANTEQUILLA 1.00;
    const 
PRECIO_LECHE       3.00;
    const 
PRECIO_HUEVOS      6.95;

    protected 
$productos = array();
    
    public function 
añadir($producto$cantidad)
    {
        
$this->productos[$producto] = $cantidad;
    }
    
    public function 
obtenerCantidad($producto)
    {
        return isset(
$this->productos[$producto]) ? $this->productos[$producto] :
               
FALSE;
    }
    
    public function 
obtenerTotal($impuesto)
    {
        
$total 0.00;
        
        
$llamadaDeRetorno =
            function (
$cantidad$producto) use ($impuesto, &$total)
            {
                
$precioUnidad constant(__CLASS__ "::PRECIO_" .
                    
strtoupper($producto));
                
$total += ($precioUnidad $cantidad) * ($impuesto 1.0);
            };
        
        
array_walk($this->productos$llamadaDeRetorno);
        return 
round($total2);
    }
}

$mi_carro = new Carro;

// Añadir algunos artículos al carro
$mi_carro->añadir('mantequilla'1);
$mi_carro->añadir('leche'3);
$mi_carro->añadir('huevos'6);

// Imprimir el total con un impuesto de venta del 5%.
print $mi_carro->obtenerTotal(0.05) . "\n";
// El resultado es 54.29
?>

Las funciones anónimas son implementadas usando la clase Closure.

Historial de cambios

Versión Descripción
5.4.0 $this puede ser usado en funciones anónimas.
5.3.0 Las funciones anónimas se encuentran disponibles.

Notas

Nota: Es posible usar func_num_args(), func_get_arg(), y func_get_args() desde dentro de una clausura.


Funciones
PHP Manual