Nie powiedzie się, gdy spróbujesz wywołać metodę chronioną lub prywatną, ponieważ używanie jej w ten sposób jest traktowane jako połączenie z zewnątrz. Nie ma sposobu, aby obejść ten problem w 5.3, o ile mi wiadomo, ale pochodzą z PHP 5.4, to 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(); // outputs "Hello world"
Nawet więcej, będzie w stanie zmienić tego, co $ wskazuje to na starcie, dla funkcji Anonima (ponownego wiązania 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(); // outputs "Bye world"
Skutecznie, funkcje anonimowym będzie miał bindTo() method, gdzie pierwszy parametr może być wykorzystany do określenia, co $ this punktów, a drugi kontroli parametrów jaki powinien być poziom widoczności:. Jeśli pominiesz drugi parametr, widoczność będzie jak wywołanie z "zewnątrz", np. dostępne są tylko właściwości publiczne. Zanotuj także sposób działania bindTo, nie modyfikuj oryginalnej funkcji, zwraca nowy.
tylko drobne konwencja forum - jest to zwykle lepiej przyjąć odpowiedź niż edytować pytanie do zastanowienia się preferowaną odpowiedź. Przede wszystkim dlatego, że odpowiedzi wciąż mają sens na wieczność, ale także oczywiście w celu uznania poprawnej odpowiedzi. – halfer
Pamiętaj, że '$ CI = $ this;' i '$ CI = & $ this; ** nie są właściwie identyczne. Może dla twoich celów, ale to nie to samo. Wypróbuj '$ CI = 'bla'; var_dump ($ this); 'w obu wersjach, aby zobaczyć różnicę. – Rudie
@Rudie Dodaję [dokumentację] (http://php.net/manual/en/language.oop5.references.php) do Twojego komentarza – steampowered