2011-10-01 4 views
4

다른 클로저에서 클로저를 래핑하는 경우 중첩 된 클로저를 호출 할 수 없습니다. 왜 안돼? 나는 그 문제를 가장 잘 보여주는 예가 있다고 생각한다.클로저에서 랩핑 된 클로저를 호출 할 수 없습니까?

이 PHP 코드 :

function FInvoke($func) { 
    $func(); 
} 

FInvoke(function() { echo "Direct Invoke Worked\n"; }); 

작품 기대와 인쇄는 "직접 호출이 근무"로. 나는 약간 우회의 다른 수준을 추가 할을 수정하는 경우

그러나, 그것은 실패

function FInvoke($func) { 
    $func(); 
} 

function FIndirectInvoke($func) { 
    FInvoke(function() { 
     $func(); 
    }); 
} 

FIndirectInvoke(function() { echo "Never makes it here"; }); 

실패 메시지가 "치명적인 오류 : 함수 이름은 라인 X에 file.php에서 문자열이어야합니다"

답변

8

당신은 "사용"키워드를

function FInvoke($func) { 
    $func(); 
} 

function FIndirectInvoke($func) { 
    FInvoke(function() use($func) { // <--- here 
     $func(); 
    }); 
} 

FIndirectInvoke(function() { echo "ok"; }); 
+0

감사를 사용하여 내부 람다 FUNC $를 통과해야! 그래서 나는이 함수들 중 하나를 "function() use ($ func) {$ func();}"이라고 선언 할 필요가있다. " –

+0

그래, 나는 미래의 독자들을 위해 그것을 떠났다. –

관련 문제