如何在PHP中调用当前的匿名函数?

时间:2011-11-29 12:55:54

标签: php

我有一个应该调用自己的匿名函数。但是,我手头没有变量或函数名,所以我希望找到一个函数,它可以在函数的上下文中返回“this”。有这样的事吗?

以下是一个例子:

$f = function() use($bar, $foo) {
  // call this function again.
};

这样打电话:

call_user_func(__FUNCTION__);

导致这一点:

  

警告:call_user_func()期望参数1是有效的回调,   未找到函数“{closure}”或函数名称无效

如果我尝试将$ f放入use-list,那么它表示该变量未定义(因为它尚未定义)。

5 个答案:

答案 0 :(得分:56)

__FUNCTION__不能用于匿名函数

将包含匿名函数的变量作为'use'子句中的引用....

$f = function() use($bar, $foo, &$f) {
   $f();
};

对此answer的提示。

答案 1 :(得分:7)

好的,我找到了这样做的方法:

$f = function() use(&$f) {
  $f();
};

$f();

关键是要传递$ f作为参考。因此,PHP不会尝试传递值,而是传递对内存槽的引用。

答案 2 :(得分:1)

  

我有一个匿名函数,应该自称。

我更喜欢在调用递归函数时使用call_user_func_array(__FUNCTION__, $params);

由于你的例子没有任何论据,我猜call_user_func(__FUNCTION__);会更适合。

您会期望并希望以下代码能够正常运行,但这太容易了。

$bar = 10;
$foo = 0;

$f = function() use (&$bar,$foo) {

    if($bar){ // condition needed to prevent infinite loop
        echo $bar-- . PHP_EOL;
        call_user_func(__FUNCTION__); // wont work
    }
};
$f();

__FUNCTION__ "Magic constant"对闭包不可用,因此需要调整代码以允许传递函数变量。我们可以通过将它作为常规参数或通过use语句传递来使函数可用。

作为参数传递的函数

$bar = 10;
$foo = 0;

$f = function( $__FUNCTION__ = null ) use (&$bar, $foo) {

    if($__FUNCTION__ && $bar){
        echo $bar-- . PHP_EOL;
        call_user_func( $__FUNCTION__, $__FUNCTION__);
    }
};
$f ( $f );

通过use声明传递的功能

$bar = 10;
$foo = 0;

$__FUNCTION__ = function() use (&$bar, $foo, &$__FUNCTION__) {

    if($bar){
        echo $bar-- . PHP_EOL;
        call_user_func( $__FUNCTION__ );
    }
};
$__FUNCTION__();

Working example,点击编辑 - > ideone it!重新运行代码。

答案 3 :(得分:-1)

http://www.php.net/manual/en/language.constants.predefined.php

编辑:在给出代码之前发布。当然它不适用于匿名函数。

call_user_func(__FUNCTION__, $param1, $param2);
call_user_func_array(__FUNCTION__, $params);

答案 4 :(得分:-4)

function i_dont_know() {
    call_user_func(__FUNCTION__,$params);
 //or
    $funcname = __FUNCTION__;
    $funcname($params);


}