web-dev-qa-db-fra.com

Pourquoi utiliser la fonction anonyme?

Dupliquer possible:
[.____] Comment utilisez-vous des fonctions anonymes dans PHP?

Pourquoi devrais-je utiliser une fonction anonyme? Je veux dire, quel est le vrai problème l'utilisant? Je ne fais tout simplement pas vraiment ça. Je veux dire, vous utilisez la fonction pour rendre le code plus propre ou pour l'utiliser plus d'une fois. Mais les fonctions anonymes ne font que ne font ni le premier ni la seconde. Je les ai googles et je ne pouvais trouver personne qui demande le même problème.

46
Shoe

Je dirais que les fonctions anonymes montrent leur beauté lorsqu'il y a de bonnes classes/fonctions de bibliothèque qui les utilisent. Ils ne sont pas si sexy par eux-mêmes. Dans le monde de .net, une technologie appelée Linq qui utilise énormément de manière très idiomatique. Retour à PHP.

Premier exemple, trier:

uasort($array, function($a, $b) { return($a > $b); });

Vous pouvez spécifier une logique complexe pour le tri:

uasort($array, function($a, $b) { return($a->Age > $b->Age); });

Un autre exemple:

$data = array( 
        array('id' => 1, 'name' => 'Bob', 'position' => 'Clerk'), 
        array('id' => 2, 'name' => 'Alan', 'position' => 'Manager'), 
        array('id' => 3, 'name' => 'James', 'position' => 'Director') 
); 

$names = array_map( 
        function($person) { return $person['name']; }, 
        $data 
);

Vous voyez à quel point vous pouvez produire des noms de noms.

Le dernier:

array_reduce(
   array_filter($array, function($val) { return $val % 2 == 0; },
   function($reduced, $value) { return $reduced*$value; }
)

Il calcule le produit de nombres pair.

ne certaine philosophie. Quelle est la fonction? Une unité de fonctionnalité pouvant être invoquée et une unité de réutilisation de code. Parfois, vous n'avez besoin que de la première partie: la capacité d'invoquer et de faire des actions, mais vous ne voulez pas le réutiliser du tout et même le rendre visible à d'autres parties du code. C'est ce que les fonctions anonymes font essentiellement.

60
Andrey

Il est utile surtout pour les rappels:

array_walk($myArray, function($value, $key) {
   // do something
});
21
netcoder

Vous utilisez normalement des fonctions anonymes pour les fonctions dont vous n'avez besoin qu'une seule fois. De cette façon, vous ne polluez pas l'espace de noms de fonction et n'exposez pas d'étranges noms de fonction comme array_walk_callback1.

7
NikiC

La raison la plus évidente est peut-être l'utilisation des rappels. Prendre usort() fonction par exemple. Il ne sert à rien d'introduire une fonction d'une ligne, qui sera utilisée une fois et une fois seulement. La fonction anonyme (généralement) convient mieux à cette tâche.

5
Mchl

Vous pouvez transmettre des fonctions anonymes autour de les sauver dans une variable.

$a=function() {
    echo 'hello world';
};

Cela signifie que vous pouvez également les utiliser plus d'une fois.

3
bcosca

Il y a des moments où vous devez utiliser une fonction. Ainsi, les fermetures conservent le code nettoyé en ne nécessitant pas de remplir vos bibliothèques avec des déclarations de fonction uniquement utilisées au même endroit. Les fermetures sont similaires à style="" et classes dans CSS. Bien sûr, vous pouvez créer une charge de banque de classes pour chaque style unique que vous disposez, ou vous pouvez les intégrer en place car vous ne l'utilisez pas ailleurs et diminuez le gonflement de vos fichiers CSS.

Ce n'est pas une nécessité, cependant, donc si vous ressentez la nécessité de déclarer explicitement des fonctions, vous êtes libre de le faire.

2
methodin

Si vous devez créer un rappel (pour faire un exemple concret, indiquez que sa fonction de comparaison pour Usort) Les fonctions anonymes sont généralement un bon moyen de partir. En particulier si la définition de la fonction dépend de quelques intrants (par cela, je veux dire une fermeture, qui n'est pas synonyme de fonction Anon)

function createCallback($key, $desc = false)
{
    return $desc ? 
       function($a, $b) use ($key) {return $b[$key] - $a[$key];} :
       function($a, $b) use ($key) {return $a[$key] - $b[$key];};
}


usort($myNestedArray, createCallback('age'));  //sort elements of $myNestedArray by key 'age' ascending
usort($myNestedArray, createCallback('age', true); //descending
2
jon_darkstar

À mon avis, les fonctions anonymes sont mieux utilisées comme rappels pour les fonctions. Beaucoup de PHP Fonctions de tablea utiliseront ceux-ci comme paramètres.

Ils pourraient également être utilisés dans Observateur/Événement auditeur Modèles.

1
gnarf

Utilisation jQuery /JavaScript Vous pouvez l'utiliser pour définir les rappels d'événements personnalisés. Jetez un coup d'œil à la façon dont les poignées JQuery Core AJAX .

Exemple de jQuery utilisant des fonctions anonymes pour les rappels d'événements:

$.ajax({
  url: 'ajax/test.html',
  complete: function(data) {
    $('.result').html(data);
    alert('Load was performed.');
  }
});

D'autres événements avec des rappels personnalisés sont beforeSend, error, success. Vous pouvez tirer pleinement parti de ce système de rappel d'événements flexible lorsque créant des plugins personnalisés

1
Derek Adair