Anonyme Funktion ist keine streng objektorientierte Funktion, aber sie ist sehr nützlich, da sie möglicherweise in objektorientierten Anwendungen auftritt, die Rückrufe verwenden.
Bitte schauen Sie sich die folgenden zwei Klassen an:
<?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); } } } ?>
Der Zweck dieses Codes besteht darin, verschiedene Rückrufe auszuführen. Das Produkt speichert nur $name und $price. Processsale besteht aus zwei Methoden. registercallback() akzeptiert einen stillen Skalar, testet den Skalar und fügt ihn dem Callback-Array hinzu. Die integrierte Funktion is_callable(), die die Testfunktion implementiert, stellt sicher, dass der übergebene Wert von Funktionen wie call_user_func() oder array_walk() aufgerufen wird.
Die Methode „process()“ akzeptiert ein Produktobjekt und gibt eine Information aus, die sich auf das Objekt bezieht. Anschließend durchlaufen Sie die Array-Eigenschaft $callbacks. Vorteile von Callbacks: Mit Callbacks können Sie zur Laufzeit Funktionen in die Komponente einfügen, die nicht direkt mit den Kernaufgaben der Komponente zusammenhängen. Mit Komponentenrückrufen geben Sie anderen die Möglichkeit, Ihren Code in Kontexten zu erweitern, die Sie nicht kennen. Nehmen wir nun an, der Benutzer möchte einen Verkaufsdatensatz erstellen. Wenn dieser Benutzer direkten Zugriff auf die Klasse hat, können Sie der Methode „process()“ Protokollierungslogik hinzufügen, aber manchmal ist dies eine schlechte Vorgehensweise. Wenn er nicht der Betreuer der Klasse ist, werden seine Änderungen an der Klasse beim nächsten Update überschrieben. Selbst wenn er der Betreuer dieser Komponente ist, spannt das Hinzufügen so vieler zusätzlicher Aufgaben zur Methode „process()“ das Pferd von hinten auf und spiegelt nicht die Kernfunktionalität dieser Methode wider, was die Möglichkeit verringern kann, dass diese Methode projektübergreifend ist. Glücklicherweise haben wir einen Prozessrückruf erstellt.<?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)); ?>
$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));
Funktionsnamen (oder sogar Objektreferenzen und Methoden) als Rückrufe verwenden.
Das obige ist der detaillierte Inhalt vonPHP-Rückrufe und anonyme Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!