2009-12-15 15 views
48

La función anónima de lambda es parte de PHP 5.3. ¿Qué uso tiene? ¿Hay algo que solo se pueda hacer con lambda? ¿Es lambda mejor para ciertas tareas?¿De qué sirve lambda en PHP?

He visto el ejemplo de Fibonacci, y realmente no necesito escribir secuencias de Fibonacci, así que aún no estoy seguro si es tan útil para los tipos de tareas que encuentro al escribir aplicaciones webbish. Entonces, ¿qué hace uno con eso en la "vida real"?

+3

gran pregunta y grandes respuestas. Creo que ya sabía qué funciones lambda y cómo se podían usar en PHP (ya que las uso todo el tiempo en jQuery) pero nunca quise pensar en ello ... simplemente lo ignoré activamente hasta que alguien me preguntó al azar sobre eso. Fui demasiado perezoso para verificar mis presunciones, pero encontrar la respuesta por accidente es perfecto para mí. Gracias otra véz. :) – KyleFarris

+0

OK, así que más allá de todo el bombo ("Lambda the Ultimate") y el hecho de que puedes construir un lenguaje completo de funciones lambda, en lo que respecta a PHP, su uso es para un solo uso, descartable función. Ese es el mensaje que estoy recibiendo. – user151841

Respuesta

76

Cualquier cosa que requiera una función temporal que probablemente solo utilizará una vez.

usaría para devoluciones de llamada, para funciones tales como:

P. ej

usort($myArray, function ($a, $b) { 
    return $a < $b; 
}); 

Antes de 5.3, que lo tienes que ..

function mySort ($a, $b) { 
    return $a < $b; 
} 
usort($myArray, 'mySort'); 

O create_function ...

usort($myArray, create_function('$a, $b', 'return $a < $b;')); 
+0

¡Gracias, Matt! ¿Podría dar un ejemplo y por qué sería mejor que una alternativa (a menos que sea aparente)? :) – user151841

+0

seguro, ver mi actualización – Matt

+1

De acuerdo. Muchas de las funciones de procesamiento de matrices utilizan devoluciones de llamada, me sentiría más feliz de poder utilizar una función anónima. – ryanday

3

Hay algunos casos de uso que se hacen más conveniente por lambdas. Por ejemplo, si un método utiliza una devolución de llamada, el uso de una lambda para esa devolución de llamada significa que no tiene que definir una función "real" en algún lugar para manejarlo. Entonces, lambdas mantiene tu código más limpio.

Como con lo anterior, las lambdas se pueden usar como funciones de "corta duración". Por ejemplo, los algoritmos de clasificación generalmente solo necesitan saber si la variable a es menor que la variable b para cualquier combinación de a y b. Para hacer un algoritmo de clasificación genérico que sea capaz de manejar cualquier clase de objetos, puede hacer que la definición de su función de clasificación sea tal que acepte una función para usar como un comparador. Proporcionar un lambda como función de comparación significa que puede definir su comportamiento de clasificación por llamada, en lugar de tener que definir una función "real" que vivirá durante toda la vida de su secuencia de comandos solo para manejar este caso de clasificación.

1

La implementación del críptico Y combinador?

function Y($F) 
{ 
    $func = function ($f) { return $f($f); }; 

    return $func(function ($f) use($F) 
    { 
    return $F(function ($x) use($f) 
    { 
     $ff = $f($f); 

     return $ff($x); 
    }); 
    }); 
} 

fuente citada: http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures

+2

Bueno, esto es genial, pero parece que es exactamente el libro de texto de ejemplo de Comp Sci que nunca usaría;) ¿Para qué * lo usa, de todos modos? – user151841

+3

Oh, yo no lo uso. Cité la fuente de dónde lo obtuve desde> :) – stormist

10

funciones anónimas (cierres) se puede crear como funciones locales (por lo tanto no pollluting el espacio global, como se sugiere Datán).

Con la palabra clave "use", las variables que se pasan o crean mediante la función adjunta se pueden utilizar dentro del cierre. Esto es muy útil en las funciones de devolución de llamada que están limitadas en su lista de parámetros. Las variables de "uso" se pueden definir fuera del cierre, eliminando la necesidad de redefinirlas cada vez que se invoca el cierre.

function change_array($arr, $pdo) 
{ 
    $keys = array('a', 'c'); 
    $anon_func = function(& $val, $key) use ($keys, $pdo) 
    { 
     if (in_array($key, $keys) { 
      $pdo->query('some query using $key'); 
      $val = $pdo->fetch(); 
     } 
    } 
    arr_walk($arr, $anon_func); 
    return $arr; 
} 

$pdo = new($dsn, $uname, $pword); 
$sample = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4); 
$sample = change_array($sample, $pdo); 

(Por supuesto, este ejemplo puede ser más simple y sin un cierre, pero es sólo para demostración.)

2

A pesar de todos los usos que uno puede pensar de las funciones lambda, en PHP también permite algo muy cierre especial llamado.Esa es la capacidad de hacer que las variables en el alcance actual estén disponibles para la función mucho después de que el alcance actual deje de existir.

Solo por mencionar algunos patrones útiles que permiten el cierre, uno puede implementar Memoization (Caching) y Curry.

También son muy útiles las de desecho o las funciones de devolución de llamada que @Matt destacó en su respuesta.

Para más información sobre los cierres, marque esta pregunta: How do JavaScript closures work?