2011-10-01 89 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

你要通過$ FUNC按鍵內部使用拉姆達 「使用」 關鍵字

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

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

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

謝謝!所以我需要將這些函數中的一個聲明爲「function()use($ func){$ func();}」 –

+0

是的,我正在爲未來的讀者離開。 –