Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Verwendung von Closure zum Erstellen anonymer Funktionen in PHP

Einführung in die Verwendung von Closure zum Erstellen anonymer Funktionen in PHP

青灯夜游
青灯夜游nach vorne
2020-07-28 17:49:231844Durchsuche

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里面的私有函数:show

Abschlü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

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";
    }
}

$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_funcDer 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

Zusammenfassung

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen