Heim > Artikel > Backend-Entwicklung > Einführung in die Verwendung von Closure zum Erstellen anonymer Funktionen in PHP
Abschlussklasse
Eine Klasse zur Darstellung anonymer Funktionen.
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.
Parameterbeschreibung:
Closure muss anonym gebunden werden Funktion.
newthis erfordert ein Objekt, das an eine anonyme Funktion gebunden ist, oder NULL, um einen ungebundenen Abschluss zu erstellen.
newscope möchte an den Klassenbereich des Abschlusses gebunden sein, oder „statisch“ bedeutet unverändert. Wenn ein Objekt übergeben wird, wird der Typname des Objekts verwendet. Der Klassenbereich wird verwendet, um die Sichtbarkeit privater, geschützter Methoden des $this-Objekts innerhalb des Abschlusses zu bestimmen.
Der Klassenbereich, mit dem der Abschluss verknüpft werden soll, oder „statisch“, um den
aktuellen Bereich beizubehalten. Stattdessen wird der Typ des Objekts verwendet. Dies bestimmt die Sichtbarkeit von
geschützten und privaten Methoden des gebundenen Objekts.
Oben ist die Definition der Methode
Der erste Parameter ist leicht zu verstehen, es ist eine Abschlussfunktion;
Der zweite Parameter ist nicht leicht zu verstehen. Wenn der zu kopierende Abschluss $this
enthält, repräsentiert dieses Objekt dies$this
, die Änderungen an diesem Objekt in der Abschlussfunktion bleiben nach Abschluss des Aufrufs konsistent, z. B. das Ändern eines Attributs
Der dritte Parameter ist nicht leicht zu verstehen, und die offizielle Beschreibung besagt auch, dass In der Wenn Sie unter den Standardparametern $this->
aufrufen, um auf die Attributfunktion in object $newthis
zuzugreifen, können Sie nur auf die Funktion des public
-Attributs zugreifen , müssen Sie festlegen Für den entsprechenden Klassennamen/die entsprechende Klasseninstanz müssen Sie wie in der Klasse auf die geschützten/privaten Attributfunktionen dieser Klasse zugreifen. protected/private
Beispiel
<?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();Der obige Code meldet einen Fehler
. Durch Hinzufügen des dritten Bindungsparameters zu Fatal error: Uncaught Error: Call to protected method T::who() from context 'Closure'
oder t::class
wird jedes Ergebnis normal ausgegeben. new T()
我是T里面的保护函数:who 我是T里面的公共函数:name 我是T里面的私有函数:showAbschlüsse können natürlich auch Parameter übergeben
$test = new StdClass(); var_dump($test); $func = Closure::bind(function($obj){ $obj->name = "燕睿涛"; }, null); $func($test); var_dump($test);Das obige Programm ist das gleiche wie die anonyme Funktion und hat keine Abhängigkeiten von irgendwelchen Objekten. Das obige Programm gibt aus:
object(stdClass)#1 (0) { } object(stdClass)#1 (1) { ["name"]=> string(9) "燕睿涛" }Es gibt auch ein spezielles Beispiel, das erklärt werden muss
<?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);Was wird in der obigen Situation ausgegeben? Ja, es wird ein Fehler gemeldet, der darauf hinweist, dass auf das private Attribut nicht zugegriffen werden kann
. Fügen Sie zu diesem Zeitpunkt einfach den dritten Parameter hinzu. Ja, ich habe gesehen, dass der dritte Parameter nicht nur den Umfang von show
beeinflusst, sondern auch den Umfang von Parametern beeinflussen kann. $this
Closure::bindTo
hat ähnliche Funktionen wie, hier ist nur eine andere Form, beide sind bindTo
, der erste Parameter ist kleiner als der von bind
und die beiden letzten von 复制当前闭包对象,绑定指定的$this对象和类作用域。
sind gleich. Ein weiterer Unterschied besteht natürlich darin, dass bind
keine statische Methode ist, sondern eine Attributmethode, die nur in Abschlüssen existiert . 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();
Die Ausgabe der obigen Funktion ähnelt der von
我是T里面的私有函数:show 我是T里面的保护函数:who 我是T里面的公共函数:name
bind
Ein TrickDiese Funktion wurde beim Betrachten des von Composer generierten automatisch ladenden Quellcodes festgestellt. Das Folgende ist ein Abfangen eines Teils des Codes in Composer
// 文件autoload_real.php call_user_func(\Composer\Autoload\ComposerStaticInit898ad46cb49e20577400c63254121bac::getInitializer($loader)); // 文件autoload_static.php public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixesPsr0; $loader->classMap = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$classMap; }, null, ClassLoader::class); }Der obige Code ist ziemlich seltsam. Der erste Eindruck ist, dass dies nicht der Fall ist. Diese Funktion gibt ein
zurück Objekt.
ist auch eine anonyme Funktion. Der letzte übergebene Parameter ist immer noch ein-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. call_user_func
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. Closure
Also, es ist in Ordnung, das oben Gesagte zu tun, es gibt auch eine andere Form callable
call_user_func(\Composer\Autoload\ComposerStaticInit898ad46cb49e20577400c63254121bac::getInitializer(), $loader); public static function getInitializer() { return \Closure::bind(function ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$prefixesPsr0; $loader->classMap = ComposerStaticInit25885cdf386fdaafc0bce14bb5a7d06e::$classMap; }, null, ClassLoader::class); }
use
Habe ich nicht Ich habe schon lange gebloggt. Manchmal bin ich zu gereizt und kann mich nicht beruhigen. Manchmal finde ich einfach nicht, was ich schreiben möchte. Man muss sich trotzdem beruhigen, alles gut machen, sich nicht aufregen, wenn etwas passiert, einen offenen Geist bewahren und alles ruhig angehen. Empfohlene verwandte Tutorials: „PHP-Tutorial“
Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung von Closure zum Erstellen anonymer Funktionen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!