anonimas - ¿Por qué y cómo usas funciones anónimas en PHP?
funciones anonimas matlab (6)
Las funciones anónimas están disponibles desde PHP 5.3.
Las funciones anónimas han estado disponibles en PHP durante mucho tiempo: create_function ha existido desde PHP 4.0.1. Sin embargo, tienes razón en que hay un nuevo concepto y sintaxis disponibles a partir de PHP 5.3.
¿Debería usarlos o evitarlos? ¿Si es así, cómo?
Si alguna vez ha usado create_function
antes, entonces la nueva sintaxis simplemente puede deslizarse donde lo usó. Como han mencionado otras respuestas, un caso común es para las funciones "desechables", donde se deben usar una sola vez (o en un solo lugar al menos). Comúnmente eso viene en forma de devoluciones de llamada para los gustos de array_map / reduce / array_filter , preg_replace_callback , usort , etc.
Ejemplo de uso de funciones anónimas para contar la cantidad de veces que las letras aparecen en palabras (esto podría hacerse de varias otras maneras, es solo un ejemplo):
$array = array(''apple'', ''banana'', ''cherry'', ''damson'');
// For each item in the array, count the letters in the word
$array = array_map(function($value){
$letters = str_split($value);
$counts = array_count_values($letters);
return $counts;
}, $array);
// Sum the counts for each letter
$array = array_reduce($array, function($reduced, $value) {
foreach ($value as $letter => $count) {
if ( ! isset($reduced[$letter])) {
$reduced[$letter] = 0;
}
$reduced[$letter] += $count;
}
return $reduced;
});
// Sort counts in descending order, no anonymous function here :-)
arsort($array);
print_r($array);
Que da (cortado por brevedad):
Array
(
[a] => 5
[n] => 3
[e] => 2
... more ...
[y] => 1
)
Las funciones anónimas están disponibles desde PHP 5.3.
¿Debería usarlos o evitarlos? ¿Si es así, cómo?
Editado ; acabo de encontrar un buen truco con las funciones anónimas de php ...
$container = new DependencyInjectionContainer();
$container->mail = function($container) {};
$conteiner->db = function($container) {};
$container->memcache = function($container) {};
Aquí hay un ejemplo de uso de usar funciones anónimas en Php
$suppliers=[''add1''=>''nodia'',''add2''=>''delhi'', ''add3''=>''UP''];
$getAddress = function($suppliers){ $address=[];
for($i=1;$i<5;$i++){
if(array_key_exists(''add''.$i, $suppliers))
$address[]=$suppliers[''add''.$i];
}
return $address;};
print_r($getAddress($suppliers));
En el ejemplo anterior, hemos escrito funciones anónimas que verifican si existe una clave en la matriz ingresada. Si existe, lo pondrá en la matriz de salida.
Las funciones anónimas pueden ser muy útiles para crear funciones en contenedores DI también, por ejemplo "bootstrap.php":
//add sessions
$di->add("session",function(){ return new Session(); });
//add cache
$di->add("cache",function(){ return new Cache(); });
//add class which will be used in any request
$di->add("anyTimeCalledClass", new SomeClass());
Ejemplo con parámetros de uso y siguientes variables
$di->add("myName",function($params) use($application){
$application->myMethod($params);
});
Entonces aquí puede ver cómo puede usar funciones anónimas para guardar memoria y cargar el servidor. Puede haber definido todos los complementos importantes, clases en di
contenedor, pero las instancias se crearán solo si lo necesita.
Tal vez podrías leer el artículo de PHP sobre Funciones Anónimas . En realidad es bastante bueno.
Un uso típico de las funciones anónimas son las funciones de devolución de llamada. Por ejemplo, puede utilizarlos para la devolución de llamada desde algoritmos de ordenamiento como en la función uksort
( http://lv.php.net/uksort ) o en el reemplazo de algoritmos como preg_replace_callback
( http://lv.php.net/manual/en/function.preg-replace-callback.php ). No lo he probado en PHP, así que esto es solo una suposición.
Las funciones anónimas son útiles cuando se usan funciones que requieren una función de devolución de llamada como array_filter
o array_map
do:
$arr = range(0, 10);
$arr_even = array_filter($arr, function($val) { return $val % 2 == 0; });
$arr_square = array_map(function($val) { return $val * $val; }, $arr);
De lo contrario, necesitaría definir una función que posiblemente solo use una vez:
function isEven($val) { return $val % 2 == 0; }
$arr_even = array_filter($arr, ''isEven'');
function square($val) { return $val * $val; }
$arr_square = array_map(''square'', $arr);