从闭包内调用当前闭包

时间:2012-06-06 18:42:28

标签: php closures anonymous-function

在javascript中,你可以做这样的事情

arr.map(function(val) {
    return typeof val == 'array' ? val.map(arguments.callee) : val.doSomething();
});

这将递归遍历arr并将doSomething应用于每个值。

在PHP中是否有与JavaScript的arguments.callee等效的内容?

3 个答案:

答案 0 :(得分:5)

  

在PHP中是否有与JavaScript的arguments.callee等效的内容?

您必须将该功能传递给自己:

$func = function($a = 0) use (&$func) {
    echo "$a\n";
    if ($a == 1) {
        return;
    }
    $func(1);
};

$func();

/* output:
0
1
*/

答案 1 :(得分:2)

我认为没有相当于arguments.callee。如果你真的想在php中使用递归lambda,那么总有y组合模式:http://en.wikipedia.org/wiki/Fixed-point_combinator#Y_combinator

答案 2 :(得分:0)

不完全符合要求,但可能更合适:

array_walk_recursive($arr, function (&$val) {
    $val = doSomething($val);
});