2012-07-21 4 views
5

próbuję zrozumieć o klasie zamknięcia, w instrukcji nie ma, Wszystko na ręcznym Link,PHP, Klasa Zamknięcie

Zamknięcie :: __ skonstruować - Konstruktor, który wykluczy konkretyzacji. Jeśli dobrze to rozumiem, jedyną instancją tej klasy jest przypisanie zmiennej funkcji anonimowej.

Ale nie rozumiałem kilka linii:

Zamknięcie :: wiążą - Duplikuje zamknięcie związanej z konkretnym obiektem klasy i zakresu.

Zamknięcie :: bindTo - Powielenie zamknięcia za pomocą nowego powiązanego obiektu i zakresu klasy.

I ostatni w instrukcji nie rozumiem to zdanie:

Oprócz metod wymienionych tutaj, klasa ta posiada również __invoke metody. Jest to zgodne z innymi klasami, które implementują magię wywołującą , ponieważ ta metoda nie jest używana do wywoływania funkcji.

Jeśli ktoś może spróbować wyjaśnić mi te linie, będę bardzo wdzięczny, życzę miłego dnia.

+0

Dziękuję wszystkim, że teraz czytam odpowiedzi. –

Odpowiedz

7

To odnosi się do calling magic.

Jak rozumiem, dla każdej klasy, która zawiera metodę __invoke, której instancje można wywoływać tak, jakby była funkcją. W ten sposób działa Closure::__invoke.

tj gdy $foo jest klasy Closure (funkcja anonimowa), nazywając $foo($bar) wezwie $foo->__invoke(bar) (chociaż członek __invoke nie ma być wywoływany bezpośrednio, to tylko, aby pokazać jak to działa).

Podczas definiowania funkcje anonimowe, to zrobić:

$greet = function($name) 
{ 
    printf("Hello %s\r\n", $name); 
}; 

Teraz $greet jest klasy Closure. i $greet->__invoke jest rodzajem równa function($name){ printf("Hello %s\r\n", $name); }

i pamiętać, Closure::__invoke jest Magic Method.

+0

Dziękuję Alvinowi Wongowi za wyjaśnienie na temat metody magicznej __invoke. Wiem również teraz o innej magicznej metodzie, którą mogę wykorzystać w OOP, więc dziękuję i życzę miłego dnia. –

3

myślę, że różnica między bind i bindTo jest właśnie w drodze oni o nazwie:

$cl->bindTo($obj) 

jest równoważna

Closure::bind($cl, $obj) 

Odnośnie __invoke meethod, to mówi, że metoda istnieje , ale w rzeczywistości nie jest używany. Kiedy używasz zamknięcia jako funkcji, używany jest mechanizm wewnętrzny (prawdopodobnie bardziej wydajny), który omija tę metodę. Ale istnieje metoda kompatybilności z innymi klasami, które można wywoływać i możesz wywołać je ręcznie, jeśli chcesz.

+0

Dziękuję Barmar, czy możesz rozwinąć nieco więcej o bind i bindTo, ponieważ nie wiem czy mam to prawo, jeśli możesz porównać bindTo i powiązać z kodem. –

+0

as [this] (http://www.php.net/manual/en/closure.bind.php) stwierdza, że ​​'Ta metoda jest statyczną wersją Zamknięcia :: bindTo().' –

+0

Zobacz przykłady w dokumentacja. Nie sądzę, że mogę zrobić coś lepszego. To tylko dwa różne sposoby pisania tego samego - bindTo jest zorientowany obiektowo, a bind to tradycyjny styl funkcyjny. – Barmar