Es schlägt fehl, wenn Sie versuchen, eine geschützte oder private Methode darauf aufzurufen, da die Verwendung auf diese Weise als Aufruf von außen gilt. Soweit ich weiß, gibt es in 5.3 keine Möglichkeit, dies zu umgehen, aber mit PHP 5.4 wird es wie erwartet funktionieren:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter(); // outputs "Hello world"
Darüber hinaus können Sie für Anonymus-Funktionen (Closing Rebinding) ändern, auf was $ dies zur Laufzeit zeigt:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
class Bye {
private $message = "Bye world\n";
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$bye = new Bye();
$byePrinter = $helloPrinter->bindTo($bye, $bye);
$byePrinter(); // outputs "Bye world"
Effektiv haben Anonymus-Funktionen eine bindTo () -Methode , bei der der erste Parameter verwendet werden kann, um anzugeben, auf was $ dies zeigt, und der zweite Parameter steuert, wie hoch die Sichtbarkeitsstufe sein soll . Wenn Sie den zweiten Parameter weglassen, entspricht die Sichtbarkeit dem Aufruf von "außen", z. Auf öffentliche Objekte kann nur zugegriffen werden. Beachten Sie auch die Funktionsweise von bindTo. Es ändert nicht die ursprüngliche Funktion, sondern gibt eine neue zurück .