Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse von Abschlüssen und anonymen Funktionen in PHP

Analyse von Abschlüssen und anonymen Funktionen in PHP

小云云
小云云Original
2017-12-25 16:42:061447Durchsuche

Ein Abschluss ist eine Funktion, die beim Erstellen den umgebenden Zustand kapselt. Auch wenn die Umgebung, in der sich der Verschluss befindet, nicht mehr existiert, bleibt der im Verschluss eingekapselte Zustand bestehen. PHP-Abschlüsse und anonyme Funktionen verwenden dieselbe Syntax wie gewöhnliche Funktionen, aber Abschlüsse und anonyme Funktionen sind tatsächlich als Funktionen getarnte Objekte (Instanzen der Closure-Klasse). Lassen Sie mich Ihnen das Wissen über Schließungen und anonyme Funktionen in PHP vorstellen. Freunde, die es benötigen, können darauf zurückgreifen.

Anonyme Funktionen sind Funktionen ohne Namen. Anonyme Funktionen können Variablen zugewiesen und wie jedes andere PHP-Objekt weitergegeben werden. Allerdings sind anonyme Funktionen immer noch Funktionen, sodass sie aufgerufen und Parameter übergeben werden können. Als Callbacks für Funktionen oder Methoden eignen sich insbesondere anonyme Funktionen.

Hinweis: Theoretisch sind Abschlüsse und anonyme Funktionen unterschiedliche Konzepte. PHP behandelt es jedoch als dasselbe Konzept. Wenn wir also von Abschlüssen sprechen, beziehen wir uns daher auch auf anonyme Funktionen und umgekehrt.

PHP-Abschlüsse und anonyme Funktionen verwenden dieselbe Syntax wie gewöhnliche Funktionen, aber Abschlüsse und anonyme Funktionen sind tatsächlich als Funktionen getarnte Objekte (Instanzen der Closure-Klasse).

Erstellen eines Abschlusses

$closure = function($name){
  return sprintf("Hello %s", $name);
}
echo $closure("jerry");
// 检测$closure变量是否是一个闭包
var_dump($closure instanceof Closure);

Der obige Code erstellt ein Abschlussobjekt und weist es dann der Variablen $closure zu. Abschlüsse sind gewöhnlichen PHP-Funktionen sehr ähnlich. Sie verwenden dieselbe Syntax, empfangen Parameter und können Werte zurückgeben.

Erklärung: Der Grund, warum wir die Variable $closure aufrufen können, liegt darin, dass der Wert dieser Variablen ein Abschluss ist und das Abschlussobjekt die magische Methode __invoke() implementiert. Solange nach dem Variablennamen () steht, sucht PHP nach der Methode __invoke() und ruft sie auf.

Abschlüsse verwenden

Wir verwenden PHP-Abschlüsse normalerweise als Rückrufe für Funktionen und Methoden. Viele PHP-Funktionen verwenden Rückruffunktionen wie array_map() und preg_replace_callback(). Im folgenden Beispiel verwenden wir array_map(), um das Array zu verarbeiten und jedes Element im Array um 1 zu erhöhen:

$nubmers = array_map(function($number){
  return $number++;
}, [1,2,3]);
var_dump($numbers);

Zusätzlicher Status

PHP-Abschlüsse kapseln den Anwendungsstatus nicht automatisch wie echte Javascrypt-Abschlüsse. Wir müssen die bindTo()-Methode des Abschlussobjekts manuell aufrufen oder das Schlüsselwort use verwenden, um den Status an den PHP-Abschluss anzuhängen. .

Verwenden Sie das Schlüsselwort „use“

Es ist üblicher, das Schlüsselwort „use“ zum Anhängen des Abschlussstatus zu verwenden, daher werden wir uns zuerst diese Methode ansehen. Wenn Sie eine Variable mit dem Schlüsselwort „use“ an einen Abschluss anhängen, merkt sich die angehängte Variable den Wert, der ihr beim Anhängen zugewiesen wurde.

function Car ($name){
  return function($statu)use($name){
    return sprintf("Car %s is %s", $name, $statu); 
  }
}
// 将车名封装在闭包中
$car = Car("bmw");
// 调用车的动作
// 输出--> "bmw is running"
echo $car("running");

Hinweis: Verwenden Sie das Schlüsselwort use, um mehrere Parameter in den Abschluss zu übergeben. Verwenden Sie in diesem Fall Kommas, um mehrere Parameter wie die Parameter einer PHP-Funktion oder -Methode zu trennen.

Verwenden Sie die bindTo()-Methode, um den Zustand des Abschlusses anzuhängen

Ähnlich wie bei anderen PHP-Objekten kann jede Abschlussinstanz das Schlüsselwort $this verwenden, um den internen Zustand des Abschlusses abzurufen. Der Standardzustand des Abschlussobjekts ist nutzlos, es gibt jedoch eine magische Methode __invoke() und eine bindTo()-Methode.

Die bindTo()-Methode fügt Abschlüssen einige interessante Möglichkeiten hinzu. Mit dieser Methode können wir den internen Zustand des Closure-Objekts an andere Objekte binden.

Der zweite Parameter der bindTo()-Methode ist sehr wichtig. Seine Funktion besteht darin, die PHP-Klasse anzugeben, zu der das Objekt des Bindungsabschlusses gehört. Daher kann ein Abschluss auf geschützte und private Mitgliedsvariablen in dem Objekt zugreifen, an das der Abschluss gebunden ist.

class TestClosure
{
  private $name=[];
  private $age;
  private $sex;
  public function addPerson($name, $personCallback){
    // 将闭包对象绑定当前实例
    $this->name[$name] = $personCallback->bindTo($this, __CLASS__);
  }
  public function display($name){
    foreach ($this->name as $key => $callback){
      if($key == $name){
        // 执行闭包对象,将闭包状态附加到类
        $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
*/

Verwandte Empfehlungen:

Wie man Abschlüsse verwendet, um externe Variablen in PHP zu erhalten

Umfassendes Verständnis von Javascript-Abschlüssen

Was sind anonyme Funktionen, verschachtelte Funktionen und Abschlüsse?

Das obige ist der detaillierte Inhalt vonAnalyse von Abschlüssen und anonymen Funktionen in PHP. 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