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

是的,我正在为未来的读者离开。 –