Es ist ziemlich schwierig, mit einem Titel für diese Frage zu kommen, aber im Grunde ist hier der Code:Warum genau führt die Übergabe einer Schließung von einer Klasse zur anderen und den Aufruf von der zweiten Klasse Code aus der ersten Klasse ausführen?
<?php
class Sub {
protected $closure;
public function setClosure($closure) {
$this->closure = $closure;
}
public function callClosure() {
$this->closure->__invoke();
}
protected function outcome() {
echo 'calling from sub';
}
}
class Main {
public function __construct() {
$this->sub = new Sub();
}
public function start() {
$this->sub->setClosure(function() {
$this->outcome();
});
$this->sub->callClosure();
}
protected function outcome() {
echo 'calling from main';
}
}
$main = new Main();
$main->start();
Das Ergebnis davon ist calling from main
. Das ist genau das, was ich will, da ich mich mit diesem Verhalten beschäftigen werde und ich verstehe nicht ganz, warum es so funktioniert, möchte ich etwas Klärung.
Bevor ich den Code schrieb, erwartete ich, dass er die outcome
-Methode aus der Klasse Sub
, nicht aus der Klasse Main
aufruft. Verwendet der Abschluss $this
aus dem Bereich, aus dem es definiert wurde? Was ist, wenn ich, aus welchem Grund auch immer, möchte ich $this
aus dem Bereich verwenden, aus dem es aufgerufen wird?
Da der Schließung werden [in die zweite Klasse Instanz gebunden] muss (http://php.net/manual/en/closure.bind.php) –