【问题标题】:PHP closures require arguments passedPHP 闭包需要传递参数
【发布时间】:2012-06-22 00:21:25
【问题描述】:

试图弄清楚为什么 php 匿名函数只有在函数头中给出参数时才起作用。

例如

$f = function(){
    echo "hello world";
};
$f;
$f();

行不通。但是

$f = function($argument){
    echo $argument;
}
$f('hello world');

工作得很好。

为什么它需要参数,有什么解决方法吗?

编辑

这一定是版本问题。我在 5.3.18 上,我的第一个例子肯定行不通。对于那些不相信的人,它会抛出:

Parse error: syntax error, unexpected T_FUNCTION in index.php(192) : 
  eval()'d code on line 1

编辑

看了 DaveRandom 的回答后,我又回到不知道发生了什么的状态。也就是说,如果他们是正确的,它可以在 5.3.10 中工作......

【问题讨论】:

    标签: php closures


    【解决方案1】:

    这是perfectly valid 语法并输出hello world

    $f = function(){
        echo "hello world";
    };
    $f();
    

    $f; 行什么都不做,相当于声明任何其他变量,然后写入新的变量名和分号。

    匿名函数不需要参数,有关它们的更多详细信息,请参阅the manual

    您收到这些语法错误是因为you are running a PHP version < 5.3

    【讨论】:

    • @DanielNill - 你确定你运行的是 PHP > 5.3 吗?查看我的编辑 - 您的错误会导致不匹配。
    • 看起来是这样。 php -versionPHP 5.3.8 with Suhosin-Patch (cli) (built: Nov 15 2011 15:33:15) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies。但这一定是配置问题,或者我命令行上的 php 版本与我安装的 xampp 上的版本不匹配。闭包是在 5.3 中引入的,所以我认为如果它们在给定版本中使用参数,它们将在同一版本中不使用参数......
    • 情况可能并非如此:命令行中的php -version 可以调用与服务器上正在执行的不同的PHP。在 PHP 脚本中执行 echo phpversion(); 并将其加载到浏览器中查看。
    • 是的,看起来是版本问题。升级 php 似乎已经修复了它。想知道为什么将参数传递给函数会起作用...
    • @DanielNill 我找不到 record 这是一个错误或功能更改,因为 5.3.8 或其他版本。可能是 suhosin 的错误?也许您的测试用例中有其他语法错误?看来您现在已经解决了这个问题,所以它现在是学术性的,但是出于兴趣,您遇到了什么错误? E_PARSE 或某种运行时错误?
    【解决方案2】:

    这不会调用闭包:

    $f;
    

    但是这个可以:

    $f();
    

    函数调用需要解析器识别括号。如果您只提到变量$f;,那么这是一个空表达式。 $f 中包含的闭包对象被分配给一个临时的 zval(变量占位符),然后被丢弃。

    【讨论】:

      【解决方案3】:

      第一个代码works fine 如果你删除无意义的$f; 行。

      编辑实际上,still works 即使你把那行留在里面。5.3.10 也是如此。

      【讨论】:

      • 由于$f();,它仅在您的示例中有效,如果您删除它,它不会打印任何内容。
      • @nickb 嗯,是的,你从不叫它它不会做任何事情......但肯定这是给定的吗?
      • 我想我不明白你所说的“它是双向的”是什么意思。你指的是哪几种方式?
      • @nickb 里面有没有$f这个没用的语句
      • @nickb 我认为 $f; 单独一行会引发错误,但显然不会。我的意思是你可以把线路留在里面,它仍然可以工作(如果你检查键盘会更明显)。我将进行编辑以使其更清晰。
      猜你喜欢
      • 2020-11-15
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 2017-01-19
      • 2018-04-27
      相关资源
      最近更新 更多