Obtenez une meilleure compréhension des fonctions anonymes dans PHP

Source : Internet
Auteur : utilisateur
La fonction de fonction anonyme est d'élargir l'utilisation des fonctions, avant PHP 5.3, la façon de passer Callback, nous n'avons que deux choix: le nom de fonction de la chaîne , en utilisant le retour de la fonction de création dans PHP 5.3, nous avons un choix de plus, qui est, Fermeture. $func s-fonction()';...'; tableau-marche ($ar

Le rôle des fonctions anonymes est d'élargir l'utilisation des fonctions, avant PHP 5.3, la façon de passer Callback, nous n'avons que deux options:

Le nom de fonction de la chaîne

Le retour de l'utilisation de la fonction de création

Après PHP 5.3, nous avons une option de plus, qui est la fermeture.

 
  1. $func fonction() s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  2. marche de tableau ($arr, $func);

Du point de vue de la mise en œuvre, la première façon: passer une chaîne de nom de fonction est le plus simple. La deuxième façon, créer-fonction, est essentiellement la même que la première, et la création-fonction renvoie le nom de fonction d'une chaîne, qui est sous la forme de:

 
  1. "C'est 000 slambda" . compter (anonyme?fonctions)

Jetons un coup d'oeil aux étapes pour implémenter la fonction de création :

1. Obtenez l'argument, le corps de fonction ;

2. Reconstituer un "fonction s-lambda-func (argument) "La chaîne;

3. eval;

4. Le corps de fonction obtenu après avoir trouvé l'eval dans le tableau de fonction est trouvé par le corps de fonction de la fonction, et l'erreur est faite si elle n'est pas trouvée ;

5. Définir un nom de fonction: "000 s lambda" . compter (anonyme?fonctions)

6. Remplacez le nouveau nom de fonction par le nouveau nom de la slambda-func;

7. Renvoie une nouvelle fonction.

Vérifions que :

 
  1. créer-fonction ("""""echo-fonction";');
  2. appel-utilisateur-func ("000lambda'1"), 1);
  3. ?>
  4. La sortie de la slambda-fun

Parce que dans l'eval, le nom de la fonction est "?lambda-func", de sorte que la fonction anonyme sera sortie dans le "lamb?lambda-func," et parce que la dernière utilisation de "?000?lambda".""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Rebaptisé la fonction dans la table de fonction, de sorte qu'il peut être rebaptisé par le "?000?lambda " . Cette fonction anonyme est appelée par le comte (anonyme?fonctions). Pour confirmer cela, vous pouvez vérifier la valeur de retour de la fonction de création.

Et au moment où PHP 5.3 a été libéré, l'une des nouvelles fonctionnalités était de soutenir la fermeture / Lambda Fonction, et ma première réaction a été de penser que zval avait ajouté un IS-FUNCTION, mais effectivement construit une fermeture "classe" introduit par PHP 5.3. L'exemple du constructeur de la classe Closure est privé, de sorte qu'il ne peut pas être directement instantané, et la classe Fermeture est une classe finale, de sorte qu'il ne peut pas être dérivé comme une sous-classe de classe de base.

 
  1. php-5.3.0
  2. $class s newClass Reflection ("Closure");
  3. var-dump ($class-isInternal();
  4. var-dump ($class-isAbstract));
  5. var-dump ($class-isFinal();
  6. var-dump ($class-isInterface());
  7. production:
  8. bool (vrai)
  9. bool (faux)
  10. bool (vrai)
  11. bool (faux)
  12. ?>

Le support des fermetures dans PHP 5.3 est simplement de rendre les variables externes à garder, comme les «propriétés statiques» de l'objet de fermeture (pas les propriétés traversables / accessibles dans le sens ordinaire).

 
  1. php-5.3.0
  2. $b la "laruence";
  3. $func fonction ($a) utiliser ($b) s.
  4. var-dump ($func);
  5. /- Sortie:
  6. objet () #1 (2)
  7. "statique""
  8. tableau (1)
  9. "b" s -corde (8) "laruence"
  10. }
  11. "paramètre"
  12. tableau (1)
  13. "$a" sstring (10)"
  14. }
  15. }
  16. */

Cette mise en œuvre, personnellement pense et JS soutien à la fermeture, est encore un peu trop brut.

Nous contacter

Le contenu de cette page provient d'Internet et ne reflète pas l'opinion d'Alibaba Cloud ; les produits et services mentionnés sur cette page n'ont aucune relation avec Alibaba Cloud. Si le contenu de la page vous semble problématique, veuillez nous écrire un courriel, nous traiterons le problème dans les 5 jours suivant la réception de votre message.

Si vous constatez des cas de plagiat de la part de la communauté, veuillez envoyer un courriel à : info-contact@alibabacloud.com et fournir des preuves pertinentes. Un membre de notre équipe vous contactera dans les 5 jours ouvrables.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.