【问题标题】:Is using the short notation for directly called function safe in PHP7?在 PHP7 中直接调用函数是否安全?
【发布时间】:2021-05-07 03:04:06
【问题描述】:

从 PHP7 开始,似乎可以像这样直接调用匿名函数:

(function () { echo 'Hello!'; })();

我在一些开源代码库中偶然发现了这一点。我试图在 PHP 文档(包括变更日志和 RFC)中找到任何关于此的提示。似乎没有,似乎完全没有记录。

以这种方式调用函数是否安全,或者我应该像过去那样使用call_user_func();?这是否记录在某处?

我知道这些问题和答案:

他们只是说它应该起作用以及它是如何起作用的。我知道这个。我的问题不是关于“如何”!这是关于这是否实际上是一个官方的 PHP 功能,或者它是否只是“偶然”工作(因为它似乎没有记录)。

【问题讨论】:

  • @ThomasSablik 不,它只是将其声明为(假设的)事实(我已经看到了这个问题)。没有任何官方文档的链接。我不喜欢依赖未记录的功能。
  • 我不确定它是否明确记录在任何编程标准中,但许多语言都支持它。那不是特例。它是语言语法的一部分。如果您问这个问题,请说明为什么它不应该工作。
  • 您如何定义“安全”?为什么使用它不“安全”?
  • 是的,它是documented - 新添加的通用语法

标签: php


【解决方案1】:

您不会在主手册中发现此功能被记录为功能的原因是因为它不是一个功能,它只是其他功能的结果

  • function () { echo 'Hello!'; } 创建一个 Closure 对象
  • () 放在Closure 对象执行该闭包之后

这与意外不太一样,但我明白你为什么会这么想,因为it didn't work in PHP 5

更改的原因是 PHP 的解析器在 PHP 7.0 to use more consistent rules when parsing variablesintroducing an extra stage called an Abstract Syntax Tree 中进行了大修。这改变了一些代码的含义,但允许其他情况在逻辑上应该是可能的,但以前很难实现。

允许以前存在语法错误的代码通常不被视为兼容性中断,因此并非此更改启用的每条语法都包含在迁移指南中。

但是,删除这个功能 - 即使没有记录 - 是一个兼容性问题,所以至少你会得到一些通知,它会改变,它将是“主要版本”(9.0、10.0 等)。由于它是一种有用的语法,因此没有理由认为它会停止工作,除非有一些甚至更有用的功能因某种原因与它发生冲突。 p>

【讨论】:

    【解决方案2】:

    只是把一些想法放在一起:(function () { echo 'Hello!'; }) 定义了一个Closure 类型的类实例。将闭包放入变量有助于理解:

    $x = (function () { echo 'Hello!'; });
    echo gettype($x);
    

    从 PHP 5.3 开始打印object。自 PHP 5.3 以来,$x(); 的结果也没有改变。但改变的是unified handling of variables - 这使您不必显式定义变量,而是直接调用闭包,就像您首先将其放入变量中一样

    【讨论】:

    • 啊,很好的发现是 RFC 而不是 AST 在技术上使这成为可能。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2014-03-19
    • 2011-07-14
    • 2021-02-09
    • 2013-05-15
    • 2017-07-27
    • 2011-10-10
    相关资源
    最近更新 更多