Fonction anonyme n'est pas une fonctionnalité strictement orientée objet, mais elle est très utile car vous pouvez la rencontrer dans des applications orientées objet qui utilisent des rappels.
Veuillez consulter les deux classes suivantes :
<?php class Product { public $name; public $price; function construct($name, $price) { $this->name = $name; $this->price= $price; } } class ProcessSale { private $callbacks; function register_callback($callback) { if(!is_callable($callback)) //判断是否可以调用 { throw new Exception('callback not callable'); } $this->callbacks[] = $callback; } function process($product) { print "{$product->name}: processing\n"; foreach($this->callbacks as $callback) { call_user_func($callback, $product); } } } ?>
Le but de ce code est d'exécuter divers rappels. Le produit stocke uniquement $name et $price. Processsale se compose de 2 méthodes. registercallback() accepte un scalaire silencieux, teste le scalaire et l'ajoute au tableau de rappel. La fonction fonction intégrée is_callable() qui implémente la fonction de test garantit que la valeur transmise est appelée par des fonctions telles que call_user_func() ou array_walk().
La méthode process() accepte un objet produit et génère une information relative à l'objet. Parcourez ensuite la propriété du tableau $callbacks.
Avantages des rappels : Vous pouvez utiliser des rappels pour insérer des fonctions qui ne sont pas directement liées aux tâches principales du composant dans le composant au moment de l'exécution. Avec les rappels de composants, vous donnez aux autres le pouvoir d'étendre votre code dans des contextes que vous ne connaissez pas.
Supposons maintenant que l'utilisateur souhaite créer un enregistrement de ventes. Si cet utilisateur a un accès direct à la classe, vous pouvez ajouter une logique de journalisation dans la méthode process(), mais c'est parfois une mauvaise pratique. S'il n'est pas le responsable de la classe, ses modifications apportées à la classe seront écrasées lors de la prochaine mise à jour. Même s'il est le responsable de ce composant, ajouter autant de tâches supplémentaires à la méthode process() revient à mettre la charrue avant les boeufs et à ne pas refléter la fonctionnalité de base de cette méthode, ce qui peut réduire la possibilité que cette méthode croise les projets.
Heureusement, nous avons créé un rappel de processus.
<?php class Product { public $name; public $price; function construct($name, $price) { $this->name = $name; $this->price= $price; } } class ProcessSale { private $callbacks; function register_callback($callback) { if(!is_callable($callback)) //判断是否可以调用 { throw new Exception('callback not callable'); } $this->callbacks[] = $callback; } function process($product) { print "{$product->name}: processing\n"; foreach($this->callbacks as $callback) { call_user_func($callback, $product); } } } $logger = create_function('$product', 'print " logging ({$product->name})\n";'); $p1 = new ProcessSale(); $p1->register_callback($logger); $p1->process(new Product("shoes", 8)); print "\n"; $p1->process(new Product("coffee", 9)); ?>
Le résultat court tout seul.
PHP 5.3 et versions ultérieures offrent une meilleure façon d'implémenter des fonctions anonymes.
$logger = function($product) { print " logging ({$product->name})\n"; }; $p1 = new ProcessSale(); $p1->register_callback($logger); $p1->process(new Product("shoes", 8)); print "\n"; $p1->process(new Product("coffee", 9));
Cette méthode utilise le mot-clé function inline et n'a pas de nom de fonction. Notez qu'étant donné qu'il s'agit d'une instruction en ligne, un point-virgule est requis à la fin du bloc de code.
Les rappels ne doivent pas nécessairement être anonymes, vous pouvez utiliser les noms de fonctions (ou même les références et méthodes d'objet) comme rappels.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!