web-dev-qa-db-fra.com

À quoi sert 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? Est-ce que lambda est meilleur pour certaines tâches?

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

55
user151841

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

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

Par exemple.

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

Avant 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;'));
79
Matt

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

Avec le mot clé "use", les variables qui sont passées 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, éliminant ainsi la nécessité de les redéfinir à chaque appel de la fermeture.

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

11
GZipp

Il y a certains cas d'utilisation qui sont rendus plus pratiques par les lambdas. Par exemple, si une méthode utilise un rappel, l'utilisation d'un lambda pour ce rappel signifie que vous n'avez pas besoin de définir une fonction "réelle" quelque part pour la gérer. Ainsi, les lambdas gardent votre code plus propre.

Comme avec ce qui précède, les lambdas peuvent être utilisés comme des fonctions "de courte durée". 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 et b. Pour créer un algorithme de tri générique capable de gérer n'importe quelle classe d'objets, vous pouvez définir la définition de votre fonction de tri de telle sorte 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 par appel, plutôt que d'avoir à définir une "vraie" fonction qui vivra pendant la durée de vie de votre script juste pour gérer ce cas de tri.

3
Dathan

Malgré toutes les utilisations que l'on peut penser pour les fonctions lambda, en PHP il permet également quelque chose de très spécial appelé fermeture. C'est la possibilité de mettre des variables dans la portée actuelle à la disposition de la fonction longtemps après la la portée actuelle cesse d'exister.

Juste pour mentionner quelques modèles utiles que la fermeture vous permet, on peut implémenter Memoization (Caching) et Curry .

Les fonctions à jeter ou de rappel que @Matt a mises en évidence dans sa réponse sont également très utiles.

Pour plus d'informations sur les fermetures, consultez cette question: Comment fonctionnent les fermetures JavaScript?

3
7hi4g0

L'implémentation du combinateur cryptique Y?

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

1
stormist