Nie powiedzie się, gdy spróbujesz wywołać chronioną lub prywatną metodę, ponieważ użycie jej w ten sposób liczy się jako wywołanie z zewnątrz. O ile wiem, nie ma sposobu na obejście tego w 5.3, ale w PHP 5.4 będzie działać zgodnie z oczekiwaniami, po wyjęciu z pudełka:
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter();
Co więcej, będziesz mógł zmienić to, na co wskazuje $ this w czasie wykonywania, dla funkcji anonimowych (ponowne wiązanie zamknięcia):
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();
W efekcie funkcje anonimowe będą miały metodę bindTo () , w której pierwszy parametr może być użyty do określenia, na co wskazuje $ this, a drugi parametr kontroluje, jaki powinien być poziom widoczności . Jeśli pominiesz drugi parametr, widoczność będzie podobna do wywoływania z „zewnątrz”, np. możliwy jest dostęp tylko do właściwości publicznych. Zwróć również uwagę na sposób działania bindTo, nie modyfikuje oryginalnej funkcji, zwraca nową .