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

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

失败信息是“致命错误:文件.php第X行的函数名必须是字符串”。
1个回答

8

您需要使用"use"关键字将$func传递给内部lambda函数。

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

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

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

谢谢!所以我需要将其中一个函数声明为"function () use ($func) { $func(); }" - Jon Hess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接