无法调用封闭在封闭中的闭包?

时间:2011-10-01 07:20:20

标签: php

如果我在另一个闭包中包装一个闭包,我就无法调用嵌套闭包。为什么不?我认为一个例子最能说明问题。

这个PHP代码:

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

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

按预期工作并打印“Direct Invoke Worked”。

但是,如果我稍微修改它以添加另一个间接级别,它就会失败:

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

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

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

失败消息是“致命错误:函数名称必须是第X行的file.php中的字符串”

1 个答案:

答案 0 :(得分:8)

你必须使用“use”关键字

将$ func传递给内部lambda
function FInvoke($func) {
    $func();
}

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

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