Con la salida de la versión 5.3.0 el equipo de desarrollo de PHP incorporó lo que se conoce como funciones anónimas o closure.
Una función anónima, como su nombre lo indica, no es más que una función que no tiene nombre y que puede ser usada como función de retorno (callback) permitiendo mayor elegancia y legibilidad del código fuente, también es posible asignar una función anónima a una variable tal y como se tratara de otro tipo de dato PHP, PHP internamente convierte esta variable en una instancia de la clase interna Closure.
Ejemplos
1. Partamos de que tenemos el siguiente arreglo y queremos ordenarlos usando uasort
$array = array( 'a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4 );
Antes de php-5.3.0 tendriamos algo asi como
function compare($val1, $val2) { return $val1 == $val2 ? 0 : ($val1 < $val2 ? -1 : 1); } $array = array( 'a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4 ); uasort($array, 'compare'); print_r($array); //Resultado //Array //( // [d] = -9 // [h] = -4 // [c] = -1 // [e] = 2 // [g] = 3 // [a] = 4 // [f] = 5 // [b] = 8 //)
A partir de php-5.3.0 usando funciones anónimas
$array = array( 'a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4 ); uasort($array, function ($val1, $val2) { return $val1 == $val2 ? 0 : ($val1 < $val2 ? -1 : 1); }); print_r($array); //Resultado //Array //( // [d] = -9 // [h] = -4 // [c] = -1 // [e] = 2 // [g] = 3 // [a] = 4 // [f] = 5 // [b] = 8 //)
Ambos ejemplos producen el mismo resultado pero el segundo caso permite una mejor organización y legibilidad en el código fuente.
2. Asignar una función anónima a una variable
$print_name = function ($name) { echo 'My name is ', $name, PHP_EOL; }; $print_name('Sedlav'); $print_name('Jhon Doe'); // Imprime // Mi nombre es Sedlav // Mi nombre es Jhon Doe
Nótese el punto y coma después de la llave que cierra la función anónima, el cuál es necesario pues para PHP es una asignación más; si no se pone se genera un error de sintaxis.
3. Funciones anónimas y contexto (scope)
Las funciones anónimas pueden heredar variables del contexto padre, el contexto padre es donde la función anónima fue declarada y no necesariamente desde donde se llama; dentro de una función anónima también se puede hacer referencia a constantes y a variables globales.
// Cantidad productos $products = array( 'oranges' => 10, 'mangoes' => 20, 'apples' => 5 ); // Precios unitarios define('UNIT_PRICE_ORANGES', 1.00); define('UNIT_PRICE_MANGOES', 1.50); define('UNIT_PRICE_APPLES', 3.25); function get_total($products, $tax = 1) { $total = 0.00; array_walk($products, function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant('UNIT_PRICE_' .strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }); return round($total, 2); } // Imprimir el precio total con un %5 de impuestos echo get_total($products, 0.05), PHP_EOL; // El resultado es 59.06 //