2010-08-31 15 views
17

Do utworzenia funkcji bez podania jej nazwy służy funkcja zamknięcia lub funkcja anonimowa.Tworzenie i wywoływanie funkcji anonimowej w pojedynczej instrukcji

Czy można wywoływać je bez przypisania do identyfikatora tak jak w JavaScript? np.

(function(){ 
    echo('anonymous function'); 
})(); 

Jaki jest prawidłowe użycie use konstruktem przy definiowaniu funkcji anonimowe i jaki jest status funkcji anonimowej w sposób publiczny z dostępnością do własności prywatnej?

$anon_func = 
function($my_param) use($this->object_property){ //use of $this is erroneous here 
    echo('anonymous function'); 
}; 
+4

Zamknięcie nie jest całkowicie równoznaczne z anonimowa funkcja, chociaż anonimowe funkcje w PHP są typu 'Zamknięcie'. Tak, żebyś wiedział. – BoltClock

+0

Jaki jest dokładny błąd podczas wypróbowywania drugiego przykładu kodu? "błędne" jest trochę niespecyficzne. – BoltClock

+0

Nie można użyć $ this jako zmiennej leksykalnej –

Odpowiedz

11

Czy można je wywołać bez numeru przypisując identyfikator tak, jak w przypadku JavaScript? na przykład

Nie w PHP 5.x; chyba że policzysz, gdy twoja metoda przyjmuje wywołanie zwrotne jako argument. np:

$square = array_map(function ($v) { return $v*$v; }, $array); 

Co jest właściwe wykorzystanie użytkowania konstruktem przy definiowaniu anonimowy funkcję

use słów kluczowych wskazuje, które zmienne z bieżącego zakresu leksykalnego powinny być przywożone do zamknięcia. Można nawet przekazać je przez odniesienie i zmienić zmienna podjęcia, np:

$total = 0; 
array_walk($array, function ($v) use (&$total) { $total += $v; }); 
// $total is now the sum of elements in $array 

jaki jest status anonimowego funkcji w sposób publiczny z dostępności do własności prywatnej?

Zamknięcia zdefiniowane wewnątrz klasy mają pełny dostęp do wszystkich jego właściwości i metod, w tym prywatnymi bez konieczności importowania $this poprzez słowa kluczowego use w PHP 5.4:

// this works fine in PHP 5.4 
$anon_func = 
function($my_param) { 
    $thing = $my_param + $this->object_property; 
    echo('anonymous function'); 
}; 

Należy zauważyć, że z jakiegoś dziwnego powodu obsługa dla $this w zamknięciach was removed in PHP 5.3. W tej wersji, można obejść to ograniczenie przy użyciu coś takiego:

// a workaround for PHP 5.3 
$temp = $this; 

$anon_func = 
function($my_param) use ($temp) { 
    $thing = $my_param + $temp->object_property; 
    echo('anonymous function'); 
}; 

Ale to daje dostęp tylko do członków publicznych, próbuje uzyskać dostęp do prywatnych użytkowników będzie nadal daje błąd.

Należy również pamiętać, że próba importowania $this (przez use), niezależnie od wersji PHP, spowoduje błąd krytyczny Cannot use $this as lexical variable.

+3

+1 Nie jest możliwe samodzielne wywoływanie anonimowych funkcji, takich jak '(function() {})();' w PHP jednak, prawdopodobnie z tych samych powodów wyłuskiwanie tablic nie jest jeszcze możliwe do wykonania albo jak zauważa Marc B. – BoltClock

+0

@BoltClock BTW array dereferrencing (np .: 'function foo() {return $ someArray;}', '$ var = foo() ['bar']') działa również w PHP 5.4 oraz – NullUserException

3

Nie wygląda na to, że oni wciąż muszą być zadeklarowane z notacją function() {} i zainstalować na moim 5.3.2, próbując swój przykładowy pojęcie zwraca błąd unexpected '(' składni. doc page na zamknięciach również o tym nie wspomina.

Być może stanie się to możliwe, gdy połączą parser, aby umożliwić deereferencję macierzy somefunction()[2].

+1

Dereferencje macierzy zostały dodane do [PHP 5.4] (http://www.php.net/manual/en/migration54.new-features.php), ale nadal nie można wywoływać anonimowych funkcji zaraz po ich deklaracja. – NullUserException

19
call_user_func(function() use(closure-vars){ ... }); 
+0

W jaki sposób OP tworzy właściwości klas? dostępne do zamknięcia? –

+0

Operacja op może utworzyć odwołanie obiektu do przejścia do zamknięcia za pomocą instrukcji use, tj .: $ obj = $ this; call_user_func (funkcja() use ($ obj) {}). W ten sposób ma dostęp do właściwości klas i metod wewnątrz zamknięcia. Trochę hackowania, ale najlepsze jest to, dopóki nie pojawi się PHP 5.4. – Jeremy

15

PHP 7 dodał możliwość tego.

ten kod:

(function() { echo "This works as expected in PHP 7.\n"; })(); 

prace jak można by oczekiwać w PHP 7. (Nadal nie działa w każdym wydaniu PHP 5.x.)

+0

Niesamowita funkcja. –

Powiązane problemy