Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Closure erstellt eine anonyme Funktion

PHP-Closure erstellt eine anonyme Funktion

怪我咯
怪我咯Original
2017-06-28 11:22:451185Durchsuche

Abschlussklasse

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.

Closure::bind

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 $newthisBeispielpublicprotected/private
Der obige Code meldet einen Fehler

. Fügen Sie den dritten Parameter von bind als 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 von
object(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

hat ähnliche Funktionen wie

, hier ist nur eine andere Form, beide sind und die Parameter sind kleiner als Ohne die erste ist

dasselbe wie die letzten beiden. Ein weiterer Unterschied besteht natürlich darin, dass

keine statische Methode ist, sondern eine Attributmethode, die nur in Abschlüssen existiert. bindTobindBeispiel复制当前闭包对象,绑定指定的$this对象和类作用域。bind
Die Ausgabe der obigen Funktion ähnelt der von bindTo

Ein Trick
<?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

-Objekt zurück.
我是T里面的私有函数:show
我是T里面的保护函数:who
我是T里面的公共函数:name
ist eine anonyme Funktion. Der letzte übergebene Parameter ist immer noch vom Typ

. Schauen Sie sich noch einmal den zurückgegebenen Abschluss an, der darin verwendet wird. Dabei handelt es sich um die Brücke, die den Abschluss und externe Variablen verbindet.

Der Grund, warum hier normale Parameter übergeben werden können, liegt darin, dass in PHP5 die formalen Objektparameter und tatsächlichen Parameter auf dasselbe Objekt verweisen und Änderungen am Objekt in der Funktion außerhalb des Objekts widergespiegelt werden.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn