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

Eine kurze Analyse von Abschlüssen und anonymen Funktionen in PHP

jacklove
jackloveOriginal
2018-07-04 18:00:071415Durchsuche

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 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).

Abschluss erstellen

$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 zu es in die Variable $closure ein. 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 nicht automatisch den Status der Anwendung wie echte Javascrypt-Verschlüsse, das müssen wir tun Rufen Sie sie manuell auf. Hängen Sie den Status an einen PHP-Abschluss an, indem Sie die bindTo()-Methode des Abschlussobjekts oder das Schlüsselwort use verwenden.

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 sie wie die Parameter einer PHP-Funktion zu trennen Methode. Mehrere Parameter.

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
*/

Zusammenfassung

Das Obige stellt Ihnen der Editor in PHP-Closures vor und anonyme Funktionen, ich hoffe, dass es für alle hilfreich ist. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte mich auch bei Ihnen allen für Ihre Unterstützung der chinesischen PHP-Website bedanken!

Artikel, die Sie interessieren könnten:

Quellcode-Analyse und Erklärung, warum Laravel wiederholt dieselbe Warteschlangenaufgabe ausführt

Detaillierte Erläuterung des Problems, dass mehrere Prozesse gleichzeitig Warteschlangen in Laravel Redis abrufen

Detaillierte Erläuterung des PHP-MSF-Quellcodes


Das obige ist der detaillierte Inhalt vonEine kurze Analyse 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