2009-12-15 6 views
48

람다 익명 함수는 PHP 5.3의 일부입니다. 어떤 용도로 사용합니까? 람다 만 할 수있는 것이 있습니까? 특정 작업에 대해 lambda가 더 낫습니까?PHP에서 lambda는 어떤 용도로 사용됩니까?

피보나치 예제를 보았습니다. 피보나치 시퀀스를 작성할 필요가 없으므로 웹 애플리케이션을 작성하는 과정에서 유용 할 수 있는지 확실하지 않습니다. 그렇다면 "실제 생활"에서 무엇을합니까?

+3

큰 질문 큰 응답 :

클로저에 대한 자세한 내용은이 질문을 확인하십시오. 나는 내가 람다 함수가 무엇인지, 그리고 PHP에서 (그들이 jQuery에서 항상 사용하기 때문에) 어떻게 사용할 수 있는지 알고 있었다. 그러나 나는 그것에 대해 생각하고 싶지 않았다. 누군가가 무작위로 질문 할 때까지 그냥 무시했다. 그것. 나는 내 가정을 검증하기에는 너무 게으 렀지 만 우연히 대답을 찾는 것이 나를 위해 완벽하게 작동합니다. 다시 .. 고마워. :) – KyleFarris

+0

OK, 모든 과대 광고 ("Lambda the Ultimate")와 PHP가가는 한 람다 함수에서 전체 언어를 빌드 할 수 있다는 사실을 넘어서는 것은 단일 사용, 기능. 그것이 내가받는 메시지입니다. – user151841

답변

76

아마도 한 번만 사용하는 임시 기능이 필요합니다.

일예를 :

I는 다음과 같은 기능을 위해, 콜백을 사용하는 것이

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

5.3 전에, 당신은 줄에 ..

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

또는 create_function ...

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

감사합니다, Matt! 예를 들려 주시겠습니까? 그리고 그것이 대안이 아닌 (왜 명백하지 않은 한) 이유는 무엇입니까? :) – user151841

+0

확실히, 내 업데이트를 참조하십시오 – Matt

+1

동의합니다. 많은 배열 처리 함수는 콜백을 사용하므로 익명의 함수를 사용할 수있게되어 더욱 행복합니다. – ryanday

3

람다하여보다 편리하게 몇 가지 사용 사례가 있습니다. 예를 들어, 메서드가 콜백을 사용하는 경우 해당 콜백에 람다를 사용하면 처리 할 어딘가에 "실제"함수를 정의 할 필요가 없다는 것을 의미합니다. 따라서 람다는 코드를보다 깨끗하게 유지합니다.

위와 마찬가지로 람다는 "단 수명"기능으로 사용할 수 있습니다. 예를 들어 정렬 알고리즘은 일반적으로 ab의 조합에 대해 변수 a이 변수 b보다 작은 지 알아야합니다. 모든 객체 클래스를 처리 할 수있는 일반 정렬 알고리즘을 만들려면 비교 함수로 사용할 함수를 허용하는 정렬 함수 정의를 만들 수 있습니다. 비교 함수로서 람다를 제공한다는 것은 스크립트의 수명 동안 살 수있는 "실제"함수를 정의 할 필요없이이 하나의 정렬 경우를 처리하기 위해 호출 기준으로 정렬 동작을 정의 할 수 있음을 의미합니다.

1

암호 C 결합 자의 구현은 무엇입니까?

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); 
    }); 
    }); 
} 

인용 자료 : http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures

+2

글쎄, 이건 멋지지만 정확히 내가 쓰지 않는 교과서 Comp Sci 예제 인 것 같다.) 어쨌든 그것을 사용하는 것은 무엇인가? – user151841

+3

아, 사용하지 않아서 원본을 인용했습니다.> – stormist

10

익명 기능 (폐쇄)는 (다단이 제안 따라서, 글로벌 공간 pollluting 생략) 로컬 함수로 생성 될 수있다.

"사용"키워드를 사용하면 둘러싼 함수에서 전달되거나 작성되는 변수를 클로저 내부에서 사용할 수 있습니다. 이는 매개 변수 목록에서 제한된 콜백 함수에서 매우 유용합니다. "사용"변수는 클로저 외부에서 정의 될 수 있으므로 클로저가 호출 될 때마다 다시 정의 할 필요가 없습니다.

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); 

(물론,이 예제는 폐쇄없이 간단 할 수 있지만, 데모 단지.) 하나는 람다 함수에 대해 생각할 수있는 용도의 모든에도 불구하고

2

, PHP에서도 뭔가를 매우 수 있습니다 클로저라는 특수그것은 현재 스코프가 존재를 멈춘 후에도 오랫동안 함수가 현재 스코프에서 변수를 사용할 수있게하는 능력입니다.

클로저가 허용하는 유용한 패턴을 언급하기 만하면 Memoization (Caching)Curry을 구현할 수 있습니다.

던지기 또는 @Matt가 대답에 강조 표시 한 콜백 함수도 매우 유용합니다. How do JavaScript closures work?

관련 문제