【问题标题】:How to call the current anonymous function in PHP?如何在 PHP 中调用当前的匿名函数?
【发布时间】:2012-01-08 19:28:05
【问题描述】:

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

这是一个例子:

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

这样调用:

call_user_func(__FUNCTION__);

导致:

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

如果我尝试将 $f 放在使用列表中,那么它会说该变量未定义(因为它尚未定义)。

【问题讨论】:

标签: php


【解决方案1】:

__FUNCTION__不能用于匿名函数

将保存匿名函数的变量作为“use”子句中的引用传递....

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

answer 致敬。

【讨论】:

  • 你也可以直接调用函数f
  • @QuolonelQuestions 可以unset() 一个 lambda,而不是函数定义。
【解决方案2】:

好的,我找到了方法:

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

$f();

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

【讨论】:

  • 未捕获错误:只能通过引用传递变量
【解决方案3】:

我有一个匿名函数,它应该调用自己。

我更喜欢在调用递归函数时使用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,点击edit->ideone it!重新运行代码。

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 警告:call_user_func() 期望参数 1 为有效回调,未找到函数“{closure}”或函数名称无效
    【解决方案5】:
    function i_dont_know() {
        call_user_func(__FUNCTION__,$params);
     //or
        $funcname = __FUNCTION__;
        $funcname($params);
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      相关资源
      最近更新 更多