Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Verschlüsse und anonyme Funktionen (ausführliches Tutorial)

PHP-Verschlüsse und anonyme Funktionen (ausführliches Tutorial)

亚连
亚连Original
2018-06-08 15:35:491558Durchsuche

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 Abschlüsse und anonyme Funktionen in PHP vorstellen. Freunde, die es benötigen, können darauf zurückgreifen

Abschlüsse beziehen sich auf Funktionen, die den umgebenden Zustand kapseln, wenn sie erstellt werden. Auch wenn die Umgebung, in der sich der Verschluss befindet, nicht mehr existiert, ist der im Verschluss eingekapselte Zustand weiterhin vorhanden.

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 besonders 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, findet PHP die Methode __invoke() und ruft sie auf.

Abschlüsse verwenden

Wir verwenden normalerweise PHP-Abschlüsse 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-Verschlüsse kapseln den Anwendungsstatus nicht automatisch wie echte Javascrypt-Verschlüsse, wir müssen die bindTo()-Methode des Verschlussobjekts manuell aufrufen oder die Verwendung verwenden Schlüsselwort: Status an einen PHP-Abschluss anhängen.

Verwendung des Schlüsselworts „use“

Es ist üblicher, das Schlüsselwort „use“ zum Anhängen des Abschlussstatus zu verwenden, also schauen wir uns zuerst diese Methode an. 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 Status des Abschlusses anzuhängen

Ähnlich wie bei anderen PHP-Objekten kann jede Abschlussinstanz $this verwenden Das Schlüsselwort ruft den internen Status des Abschlusses ab. 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
*/

Ich habe das Obige für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.

Verwandte Artikel:

Über benutzerdefinierte Ereignisse in Vue-Komponenten (ausführliches Tutorial)

Wie man JS verwendet, um eine kleine Ballfolge zu implementieren die Maus Mobile

Detaillierte Einführung in die grundlegende Verwendung von NW.js

Das obige ist der detaillierte Inhalt vonPHP-Verschlüsse und anonyme Funktionen (ausführliches Tutorial). 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