English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ein Closure ist eine Funktion, die umgebende Zustände bei der Erstellung verpackt. Selbst wenn das Umgebungsmedium des Closure nicht mehr existiert, bleiben die verpackten Zustände im Closure bestehen.
Eine anonyme Funktion ist eine Funktion ohne Namen. Eine anonyme Funktion kann einer Variable zugewiesen werden und kann wie jeder andere PHP-Objekt weitergegeben werden. Allerdings bleibt eine anonyme Funktion eine Funktion und kann aufgerufen werden, Parameter können übergeben werden. Anonyme Funktionen sind besonders geeignet als Callback für Funktionen oder Methoden.
Hinweis: Theoretisch gesprochen, sind Closure und anonyme Funktionen unterschiedliche Konzepte. Allerdings behandelt PHP sie als dasselbe Konzept. Daher beziehen wir uns, wenn wir von Closure sprechen, auch auf anonyme Funktionen und umgekehrt.
Die Syntax von PHP-Closure und anonymen Funktionen ist mit der einer gewöhnlichen Funktion identisch, aber Closure und anonyme Funktionen sind in der Tat Objekte, die sich als Funktionen tarnen (Instanzen der Closure-Klasse).
Erstellen Sie ein Closure
$closure = function($name){ return sprintf("Hallo %s", $name); } echo $closure("jerry"); // Überprüfen Sie, ob die Variable $closure ein Closure ist var_dump($closure instanceof Closure);
Das obige Code erstellt ein Closure-Objekt und weist es der Variable $closure zu. Ein Closure und eine gewöhnliche PHP-Funktion sind sehr ähnlich, verwenden die gleiche Syntax, akzeptieren Parameter und können Werte zurückgeben.
Erklärung: Wir können den Variable $closure aufrufen, weil der Wert dieser Variable ein Closure ist und der Closure-Objekt das Magische Method __invoke() implementiert. Wenn nach dem Variablennamen () folgt, sucht PHP nach und ruft die __invoke()-Methode auf.
Verwenden Sie geschlossene Bereiche
Wir verwenden PHP-geschlossene Bereiche normalerweise als Callback-Funktionen für Funktionen und Methoden. Viele PHP-Funktionen verwenden Callback-Funktionen, z.B. array_map() und preg_replace_callback(). Im folgenden Beispiel verwenden wir array_map(), um ein Array zu verarbeiten und jedes Element um 1 zu erhöhen.1:
$nubmers = array_map(function($number){ return $number++; }, [1,2,3]); var_dump($numbers);
Zustand anhängen
PHP-geschlossene Bereiche fassen den Zustand der Anwendung nicht wie wahre JavaScript-geschlossene Bereiche automatisch ein. Wir müssen die Methode bindTo() des geschlossenen Bereichs manuell aufrufen oder den Zustand mit dem Schlüsselwort use an den PHP-geschlossenen Bereich anhängen.
Verwenden Sie das Schlüsselwort use
Die Verwendung des Schlüsselworts use, um den Zustand des geschlossenen Bereichs hinzuzufügen, ist häufiger, daher schauen wir uns diese Methode zuerst an. Wenn Sie Variablen mit dem Schlüsselwort use an den geschlossenen Bereich anhängen, merkt sich die übergebene Variable den Wert, der ihr zu diesem Zeitpunkt zugewiesen wurde.
function Car ($name){ return function($statu)use($name){ return sprintf("Car %s is %s", $name, $statu); } } // Verpacken Sie den Namen des Autos in einem geschlossenen Bereich $car = Car("bmw"); // Aufruf der Aktion des Autos // Ausgabe--> "bmw is running" echo $car("running");
Hinweis: Mit dem Schlüsselwort use können mehrere Parameter in den geschlossenen Bereich übergeben werden. In diesem Fall müssen mehrere Parameter wie die Parameter einer PHP-Funktion oder Methode durch Kommas getrennt werden.
Verwenden Sie die Methode bindTo(), um den Zustand des geschlossenen Bereichs hinzuzufügen
Wie andere PHP-Objekte ähnlich, kann jede Instanz eines geschlossenen Bereichs den Schlüsselwort $this verwenden, um den internen Zustand des geschlossenen Bereichs zu erhalten. Der Standardzustand des geschlossenen Bereichs ist nicht sehr nützlich, aber es gibt einen magischen Methodenaufruf __invoke() und die Methode bindTo().
Die Methode bindTo() bringt einigen interessanten Potenzialen für Closure hinzu. Wir können diese Methode verwenden, um den internen Zustand des Closure-Objekts auf andere Objekte zu binden.
Der zweite Parameter der Methode bindTo() ist sehr wichtig, da er die PHP-Klasse angibt, zu der das Objekt gehört, auf das der geschlossene Bereich gebunden ist. Daher kann der geschlossene Bereich auf geschützte und private Member-Variablen des Objekts zugreifen, auf das der geschlossene Bereich gebunden ist.
class TestClosure { private $name=[]; private $age; private $sex; public function addPerson($name, $personCallback){ // Binden Sie den Closure-Objekt an die aktuelle Instanz $this->name[$name] = $personCallback->bindTo($this, __CLASS__); } public function display($name){ foreach ($this->name as $key => $callback){ if($key == $name){ // Führe den Closure-Objekt aus und füge den Closure-Status der Klasse hinzu $callback(); } } echo "name : {$name}\n"; echo "age : {$this->age}\n"; echo "sex : {$this->sex\n"; } } $person = new TestClosure(); $person->addPerson("jerry", function(){ $this->age = 19; $this->sex = "man"; }); $person->display("jerry"); /** output name : jerry age : 19 sex : man */
Zusammenfassung
Das Gesagte ist von mir allen vorgestellt worden, was PHP-Closures und anonyme Funktionen in PHP betrifft. Ich hoffe, es hilft Ihnen. Wenn Sie irgendwelche Fragen haben, hinterlassen Sie mir bitte eine Nachricht, ich werde Ihnen so schnell wie möglich antworten. Ich danke auch sehr für die Unterstützung der Website "Ruf nach dem Wissen"!