2010-03-09 33 views
43

Las funciones anónimas están disponibles desde PHP 5.3.
¿Debo usarlas o evitarlas? ¿Si es así, cómo?¿Por qué y cómo se usan funciones anónimas en PHP?

Editado; acaba 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) {}; 
+8

Hombre, no obtengo ese uso de DependencyInjection en absoluto. – Kzqai

+0

@Tchalvak, ¿por qué? En cuanto a mí, es realmente fácil de implementar y usar. ¿Hay trampas? – Kirzilla

+0

@Kirzilla '$ container = new DependencyInjectionContainer();' no tiene nada que ver con las funciones anónimas –

Respuesta

84

Anonymous functions son útiles cuando se utilizan las funciones que requieren un callback function como array_filter o array_map hacer:

$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, habría que definir una función que le sea posible utilizar sólo 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); 
+7

Eso parece ser la mayoría consiste en respuesta que he encontrado sobre el propósito de las funciones anónimas. Subraya el hecho de que, para la mayoría de las soluciones de un solo uso/un solo lugar, las funciones anónimas le permiten mantener el código correcto, donde se usa, sin necesidad de definirlo en un lugar y llamar a otro. Esto se vuelve extremadamente útil, si tiene esas funciones únicas contadas en cientos o miles en un proyecto. – trejder

9

Quizás podría leer el artículo de PHP en Anonymous Functions. En realidad es bastante bueno.

+0

Hmmm, para la documentación de php, es un buen artículo. – Kzqai

+0

Sí, de hecho muy bien explicado –

23

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 estado presente 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.

¿Los debería usar o evitar? ¿Si es así, cómo?

Si alguna vez ha utilizado create_function, la nueva sintaxis puede simplemente deslizarse en el lugar donde la utilizó. 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 que se presenta en forma de devoluciones de llamada para los gustos de array_map/reduce/filter, preg_replace_callback, usort, etc ..

Ejemplo del uso de funciones anónimas para contar el número de veces que las letras aparecen en palabras (esto podría hacerse en un número de otras maneras, es sólo 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); 

cual da (cortado con tijeras por razones de brevedad):

Array 
(
    [a] => 5 
    [n] => 3 
    [e] => 2 
    ... more ... 
    [y] => 1 
) 
+0

+1 para el uso, eso es un buen uso. – Kzqai

+0

@salathe So .. Además de trabajar con funciones de devolución de llamada, la función anónima es inútil. Simplemente no entiendo de qué se trataba la publicidad. – samayo

4

funciones anónimas pueden ser muy útil en la creación de la función en un contenedor 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 parametros de uso, y las variables siguientes

$di->add("myName",function($params) use($application){ 
     $application->myMethod($params); 
}); 

Así que aquí se puede ver cómo se puede utilizar funciones anónimas para ahorrar memoria y cargar el servidor.Puede haber definido todos los complementos importantes, las clases en el contenedor di, pero las instancias se crearán solo si lo necesita.

+0

Hola @brasofilo, ¿podrías explicar un poco más? No soy capaz de entender la diferencia. – San

+1

@San diferencia es un ejemplo cuando se registra: $ di-> add ('service', new Object()); la instancia de objeto se almacena en di contenedor. Cuando creará $ di-> add ('servicio', función() {return new Object();}); la instancia de objeto se crea en "solicitud", por lo que la diferencia es que puede haber registrado todos los servicios en di y los servicios registrados no consumirán memoria, ya que las instancias aún no se han creado. En muchos casos, los desarrolladores registran servicios a di pero en cada solicitud se crea el servicio, y este proceso ralentiza la ejecución. Cuando tienes una función anónima no se crea nada. – Kamil

+0

¡Muchas gracias! – San

0

Aquí es muestra de ejemplo utilizando utilizando 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 comprueban si existe una clave en orden introducido. Si existe, lo pondrá en la matriz de salida.

Cuestiones relacionadas