2009-12-15 13 views
48

Anonimowa funkcja lambda jest częścią PHP 5.3. Jakie ma to zastosowanie? Czy jest coś, co można zrobić tylko dzięki lambda? Czy lambda jest lepsza dla niektórych zadań?Co to jest lambda w PHP?

Widziałem przykład Fibonacciego i naprawdę nie muszę pisać sekwencji Fibonacciego, więc nadal nie jestem pewien, czy jest to przydatne dla rodzajów zadań, które napotykam podczas pisania aplikacji webbish. Co więc zrobić z tym w "prawdziwym życiu"?

+3

wielkie pytanie i wielkie odpowiedzi. Myślę, że wiedziałem, jakie funkcje lambda były i jak można je wykorzystać w PHP (ponieważ używam ich cały czas w jQuery), ale nigdy nie chciałem o tym myśleć ... po prostu aktywnie zignorowałem to, aż ktoś przypadkowo zapytał o to. Byłem zbyt leniwy, aby zweryfikować moje przypuszczenia, ale przypadkowo znalezienie odpowiedzi zadziałało idealnie dla mnie. Jeszcze raz dzięki. :) – KyleFarris

+0

OK, więc poza wszystkimi hype ("Lambda the Ultimate") i faktem, że można zbudować cały język z funkcji lambda, o ile PHP idzie, to jest użycie do jednorazowego użycia, wyrzucenia funkcjonować. To jest wiadomość, którą otrzymuję. – user151841

Odpowiedz

76

Wszystko, co wymaga funkcji tymczasowej, której prawdopodobnie użyjesz tylko raz.

chciałbym je wykorzystać do wywołania zwrotne dla funkcji, takich jak:

np

usort($myArray, function ($a, $b) { 
    return $a < $b; 
}); 

Przed 5.3, trzeba by ..

function mySort ($a, $b) { 
    return $a < $b; 
} 
usort($myArray, 'mySort'); 

Albo create_function ...

usort($myArray, create_function('$a, $b', 'return $a < $b;')); 
+0

Dziękuję, Matt! Czy mógłbyś podać przykład i dlaczego byłaby lepsza niż alternatywa (chyba, że ​​jest to oczywiste)? :) – user151841

+0

pewnie, zobacz moją aktualizację – Matt

+1

Uzgodnione. Wiele funkcji przetwarzania tablic korzysta z wywołań zwrotnych. Byłbym bardziej zadowolony z możliwości używania anonimowej funkcji. – ryanday

3

Istnieją pewne przypadki użycia, które są wykonane wygodniejsze przez lambda. Na przykład, jeśli metoda używa wywołania zwrotnego, użycie wartości lambda dla tego wywołania zwrotnego oznacza, że ​​nie trzeba definiować funkcji "rzeczywistej" w celu jej obsługi. Tak, lambdy utrzymują twój kod w czystości.

Tak jak powyżej, lambdas może być używany jako funkcja "krótkotrwała". Na przykład algorytmy sortowania zwykle muszą jedynie wiedzieć, czy zmienna a jest mniejsza niż zmienna b dla dowolnej kombinacji a i b. Aby utworzyć ogólny algorytm sortowania, który jest w stanie obsłużyć dowolną klasę obiektów, możesz zdefiniować funkcję sortowania tak, aby akceptowała funkcję, która będzie używana jako komparator. Dostarczenie lambda jako funkcji porównawczej oznacza, że ​​możesz zdefiniować swoje zachowanie sortowania dla poszczególnych wywołań, zamiast definiować "prawdziwą" funkcję, która będzie żyć przez całe życie twojego skryptu tylko po to, aby obsłużyć ten jeden sortujący przypadek.

1

Wdrożenie tajemniczego kombinatora Y?

function Y($F) 
{ 
    $func = function ($f) { return $f($f); }; 

    return $func(function ($f) use($F) 
    { 
    return $F(function ($x) use($f) 
    { 
     $ff = $f($f); 

     return $ff($x); 
    }); 
    }); 
} 

Cytowane Źródło: http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures

+2

Cóż, to jest fajne, ale wygląda na to, że jest to dokładnie przykładowy podręcznik Comp Sci, którego nigdy bym nie użył;) Do czego * czy * używasz tego? – user151841

+3

Och, nie używam tego, zacytowałem źródło, z którego je otrzymałem> :) – stormist

10

anonimowych funkcje (zamknięcia) może być utworzony jako funkcji lokalnych (a więc nie pollluting przestrzeni globalnej, jak sugeruje Dathan).

Za pomocą słowa kluczowego "use" zmienne przekazywane lub tworzone przez funkcję otaczającą mogą być używane wewnątrz zamknięcia. Jest to bardzo przydatne w funkcjach zwrotnych, które są ograniczone na ich liście parametrów. Zmienne "użytkowania" można zdefiniować poza zamknięciem, eliminując potrzebę ich ponownego definiowania za każdym razem, gdy wywoływane jest zamknięcie.

function change_array($arr, $pdo) 
{ 
    $keys = array('a', 'c'); 
    $anon_func = function(& $val, $key) use ($keys, $pdo) 
    { 
     if (in_array($key, $keys) { 
      $pdo->query('some query using $key'); 
      $val = $pdo->fetch(); 
     } 
    } 
    arr_walk($arr, $anon_func); 
    return $arr; 
} 

$pdo = new($dsn, $uname, $pword); 
$sample = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4); 
$sample = change_array($sample, $pdo); 

(Oczywiście ten przykład może być prostsze bez zamknięcia, ale to tylko na pokaz.)

2

Pomimo wszystkich tych zastosowań można myśleć o funkcjach lambda, w PHP pozwala także coś bardzo specjalne zwane zamknięciem.Jest to zdolność do wprowadzania zmiennych w bieżącym zakresie do funkcji długo po ustaniu aktualnego zakresu.

Wystarczy wspomnieć o niektórych przydatnych wzorach, które pozwalają na zamknięcie, można wdrożyć Memoization (Caching) i Curry.

Również bardzo przydatne są funkcje wyrzucania lub funkcje oddzwaniania, które wyróżniono w odpowiedzi @Matta.

Więcej informacji o zamknięciach, sprawdź to pytanie: How do JavaScript closures work?