在PHP7中对直接调用的函数使用短表示法是否安全?
从 PHP7 开始,似乎可以像这样直接调用匿名函数:
(function () { echo 'Hello!'; })();
我在一些开源代码库中偶然发现了这一点。我试图在 PHP 文档(包括变更日志和 RFC)中找到任何关于此的提示。似乎没有,似乎完全没有记录。
以这种方式调用函数是否安全,还是应该call_user_func();像过去那样使用?这是在某处记录的吗?
我知道这些问题和答案:
- PHP 中的 IIFE(立即调用函数表达式)?
- /sf/answers/2453122241/
他们只是说它应该起作用以及它是如何起作用的。我知道这个。我的问题不是关于“如何”!这是关于这是否真的是一个官方的 PHP 功能,或者它是否只是“偶然”工作(因为它似乎没有记录)。
回答
你不会在主手册中发现它作为一项功能记录的原因是因为它不是一个,它只是其他功能的结果:
function () { echo 'Hello!'; }创建一个Closure对象()在Closure对象执行该闭包之后放置
这是不太一样的意外,但我可以看到,为什么你会认为,因为它没有工作在PHP 5中。
更改的原因是 PHP 的解析器在 PHP 7.0 中进行了大修,以便在解析变量时使用更一致的规则,并引入了一个名为 Abstract Syntax Tree 的额外阶段。这改变了一些代码的含义,但允许其他逻辑上应该是可能的,但以前很难实现的情况。
允许以前是语法错误的代码通常不被视为兼容性中断,因此并非此更改启用的每条语法都包含在迁移指南中。
但是,删除此功能 - 即使没有记录 -也会破坏兼容性,因此至少您会注意到它会发生变化,并且它将处于“主要版本”(9.0、10.0 等) . 由于它是一个有用的语法,没有理由假设它会停止工作,除非有一些更有用的功能由于某种原因与它发生冲突。