Podręcznik PHP stwierdza
Nie można używać
$this
funkcji anonimowej przed PHP 5.4.0
na stronie funkcji anonimowych . Ale odkryłem, że mogę sprawić, by działało, przypisując $this
do zmiennej i przekazując zmienną do use
instrukcji w definicji funkcji.
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
Czy to dobra praktyka?
Czy istnieje lepszy sposób na dostęp $this
do anonimowej funkcji przy użyciu PHP 5.3?
php
anonymous-function
steampowered
źródło
źródło
$CI = $this;
i$CI =& $this;
nie są identyczne. Może do twoich celów, ale to nie to samo. Wypróbuj$CI = 'bla'; var_dump($this);
obie wersje, aby zobaczyć różnicę.Odpowiedzi:
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(); // outputs "Hello world"
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(); // outputs "Bye world"
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ą .
źródło
$this
.Nie zawsze polegaj na PHP, aby przekazywać obiekty przez referencje, kiedy sam przypisujesz referencję, zachowanie nie jest takie samo, jak w większości języków OO, w których oryginalny wskaźnik jest modyfikowany.
twój przykład:
$CI = $this; $callback = function () use ($CI) { $CI->public_method(); };
Powinien być:
$CI = $this; $callback = function () use (&$CI) { $CI->public_method(); };
UWAGA ODNIESIENIA "&" i $ CI powinny być przypisane po wykonaniu ostatecznych wywołań, w przeciwnym razie możesz otrzymać nieprzewidywalne wyniki, w PHP dostęp do referencji nie zawsze jest taki sam jak dostęp do oryginalnej klasy - jeśli to ma sens.
http://php.net/manual/en/language.references.pass.php
źródło
To jest normalny sposób.
btw, spróbuj usunąć
&
to powinno działać bez tego, ponieważ obiekty w jakikolwiek sposób przechodzą obok ref.źródło
Wydaje się to w porządku, jeśli przekazanie przez odniesienie jest właściwym sposobem na zrobienie tego. Jeśli używasz PHP 5, nie potrzebujesz
&
wcześniej symbolu,$this
ponieważ zawsze będzie on przekazywany przez odniesienie, niezależnie od tego.źródło
Jest okej. Myślę, że możesz to również zrobić:
$CI = $this;
... ponieważ przypisania obejmujące obiekty zawsze będą kopiować odniesienia, a nie całe obiekty.
źródło