Heim > Artikel > Backend-Entwicklung > PHP-Closure erstellt eine anonyme Funktion
ist eine Klasse, die zur Darstellung anonymer Funktionen verwendet wird.
Anonyme Funktionen (eingeführt in PHP 5.3) erzeugen Objekte dieses Typs. In der Vergangenheit galt diese Klasse als Implementierungsdetail, aber jetzt kann man sich darauf verlassen, dass sie etwas tut. Ab PHP 5.4
verfügt diese Klasse über Methoden, die eine bessere Kontrolle über die anonyme Funktion nach ihrer Erstellung ermöglichen.
Diese Klasse kann nicht instanziiert werden. Sie enthält zwei Hauptmethoden, die beide zum Kopieren von Abschlüssen verwendet werden, eine statische und eine dynamische. Diese beiden schwer verständlichen Methoden werden ausführlich erläutert unten.
public static Closure Closure::bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] ) 参数说明: closure 需要绑定的匿名函数。 newthis 需要绑定到匿名函数的对象,或者 NULL 创建未绑定的闭包。 newscope 想要绑定给闭包的类作用域,或者 'static' 表示不改变。如果传入一个对象,则使用这个对象的类型名。 类作用域用来决定在闭包中 $this 对象的 私有、保护方法 的可见性。 The class scope to which associate the closure is to be associated, or 'static' to keep the current one. If an object is given, the type of the object will be used instead. This determines the visibility of protected and private methods of the bound object.
Der erste Parameter ist leicht zu verstehen, der zweite ist eine Abschlussfunktion Parameter Es ist nicht leicht zu verstehen. Wenn der zu kopierende Abschluss $this
enthält, stellt dieses Objekt dies dar. Die Änderungen an diesem Objekt in der Abschlussfunktion bleiben nach Abschluss des Aufrufs konsistent . Der dritte Parameter ist nicht leicht zu verstehen. Beim Aufruf von
gibt es Einschränkungen Greifen Sie nur auf die Funktionen des Attributs $this
zu. Wenn Sie auf das Attribut
zugreifen möchten, müssen Sie wie in der Klasse auf den entsprechenden Schutz zugreifen Klasse. /Private Attributfunktion. $this->
object $newthis
Beispielpublic
protected/private
Der obige Code meldet einen Fehler
t<a href="http://www.php.cn/wiki/167.html" target="_blank">::class<h4></h4></a>
oder , jedes Ergebnis wird normal ausgegeben. <?php class T { private function show() { echo "我是T里面的私有函数:show\n"; } protected function who() { echo "我是T里面的保护函数:who\n"; } public function name() { echo "我是T里面的公共函数:name\n"; } } $test = new T(); $func = Closure::bind(function(){ $this->who(); $this->name(); $this->show(); }, $test); $func();
Abschlüsse können natürlich auch Parameter übergeben Fatal error: Uncaught Error: Call to protected method T::who() from context 'Closure'
t<a href="http://www.php.cn/wiki/167.html" target="_blank">::class</a>
new T()
Das obige Programm ist das gleiche wie die anonyme Funktion und hat keine Abhängigkeiten von irgendwelchen Objekten. Das obige Programm gibt Folgendes aus:
我是T里面的保护函数:who 我是T里面的公共函数:name 我是T里面的私有函数:show
Es gibt ein weiteres Beispiel, das einer besonderen Erklärung bedarf
$test = new StdClass(); var_dump($test); $func = Closure::bind(function($obj){ $obj->name = "燕睿涛"; }, null); $func($test); var_dump($test);
Was wird in der obigen Situation ausgegeben? Ja, es wird ein Fehler gemeldet, der darauf hinweist, dass das private Attribut nicht vorhanden sein kann Zugegriffen
. Fügen Sie zu diesem Zeitpunkt einfach den dritten Parameter hinzu. Nachdem Sie gesehen haben, dass der dritte Parameter nicht nur den Umfang vonobject(stdClass)#1 (0) { } object(stdClass)#1 (1) { ["name"]=> string(9) "燕睿涛" }beeinflusst, kann
auch den Umfang des Parameters beeinflussen.
<?php class T { private function show() { echo "我是T里面的私有函数:show\n"; } protected function who() { echo "我是T里面的保护函数:who\n"; } public function name() { echo "我是T里面的公共函数:name\n"; } } $func = Closure::bind(function ($obj) { $obj->show(); }, null); $test = new T(); $func($test);
Closure::bindToshow
$this
keine statische Methode ist, sondern eine Attributmethode, die nur in Abschlüssen existiert. bindTo
bind
Beispiel复制当前闭包对象,绑定指定的$this对象和类作用域。
bind
Die Ausgabe der obigen Funktion ähnelt der von bindTo
<?php class T { private function show() { echo "我是T里面的私有函数:show\n"; } protected function who() { echo "我是T里面的保护函数:who\n"; } public function name() { echo "我是T里面的公共函数:name\n"; } } $func = function () { $this->show(); $this->who(); $this->name(); }; $funcNew = $func->bindTo(new T(), T::class); $funcNew();
Diese Funktion ist Beim Ansehen von Composer bin ich darauf gestoßen, als bind
der Quellcode automatisch geladen wurde. Es wird in Composer auf besondere Weise verwendet. Das Folgende ist ein Abfangen eines Teils des Codes in Composer 🎜>Der obige Code ist ziemlich seltsam. Der erste Eindruck ist, dass dies nicht der Fall ist. Diese Funktion gibt ein
我是T里面的私有函数:show 我是T里面的保护函数:who 我是T里面的公共函数:nameist eine anonyme Funktion. Der letzte übergebene Parameter ist immer noch vom Typ
Es ist also in Ordnung, das oben Gesagte zu tun, es gibt auch einen anderen Weg
Das obige ist der detaillierte Inhalt vonPHP-Closure erstellt eine anonyme Funktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!