57 votes

Quelle est l'utilité de lambda en PHP ?

La fonction anonyme lambda fait partie de PHP 5.3. Quelle est son utilité ? Y a-t-il quelque chose que l'on ne peut faire qu'avec lambda ? Lambda est-elle meilleure pour certaines tâches ?

J'ai vu l'exemple de Fibonacci, et je n'ai pas vraiment besoin d'écrire des séquences de Fibonacci, donc je ne suis toujours pas sûr qu'il soit si utile pour le genre de tâches que je rencontre en écrivant des applications webbish. Alors, qu'est-ce qu'on en fait dans la "vraie vie" ?

81voto

Matt Points 21690

Tout ce qui nécessite une fonction temporaire que vous n'utiliserez probablement qu'une seule fois.

Je les utiliserais pour les callbacks, pour des fonctions telles que :

Par exemple

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

Avant la 5.3, il fallait

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

Ou create_function ...

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

11voto

GZipp Points 3193

Les fonctions anonymes (fermetures) peuvent être créées en tant que fonctions locales (ne pollluant donc pas l'espace global, comme l'a suggéré Dathan).

Avec le mot-clé "use", les variables transmises ou créées par la fonction englobante peuvent être utilisées à l'intérieur de la fermeture. Ceci est très utile dans les fonctions de rappel qui sont limitées dans leur liste de paramètres. Les variables "use" peuvent être définies en dehors de la fermeture, ce qui évite de devoir les redéfinir à chaque fois que la fermeture est appelée.

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);

(Bien sûr, cet exemple peut être plus simple sans fermeture, mais c'est juste pour la démonstration).

3voto

Dathan Points 4144

Il y a certains cas d'utilisation qui sont rendus plus pratiques par les lambdas. Par exemple, si une méthode utilise un callback, utiliser un lambda pour ce callback signifie que vous n'avez pas à définir une "vraie" fonction quelque part pour le gérer. Ainsi, les lambdas permettent de garder un code plus propre.

Comme dans le cas précédent, les lambdas peuvent être utilisés comme des fonctions "éphémères". Par exemple, les algorithmes de tri n'ont généralement besoin de savoir que si la variable a est inférieure à la variable b pour toute combinaison de a y b . Pour créer un algorithme de tri générique capable de traiter n'importe quelle classe d'objets, vous pouvez définir votre fonction de tri de manière à ce qu'elle accepte une fonction à utiliser comme comparateur. Fournir un lambda comme fonction de comparaison signifie que vous pouvez définir votre comportement de tri sur une base par appel, plutôt que de devoir définir une "vraie" fonction qui vivra pendant toute la durée de vie de votre script juste pour gérer ce seul cas de tri.

3voto

7hi4g0 Points 450

Malgré toutes les utilisations auxquelles on peut penser pour les fonctions lambda, PHP permet également quelque chose de très spécial appelé fermeture. C'est la possibilité de rendre les variables de la portée actuelle disponibles pour la fonction longtemps après que la portée actuelle ait cessé d'exister.

Pour ne citer que quelques modèles utiles que la fermeture vous permet, on peut implémenter Mémorisation (mise en cache) y Curry .

Sont également très utiles les jetable ou les fonctions de rappel que @Matt a mis en évidence dans sa réponse.

Pour en savoir plus sur les fermetures, consultez cette question : Comment fonctionnent les fermetures JavaScript ?

1voto

stormist Points 1356

L'implémentation du Y combinateur cryptique ?

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);
    });
  });
}

Source citée : http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X