如何在 PHP 中立即执行匿名函数?

IT技术 php javascript function
2021-02-01 00:12:10

在 JavaScript 中,您可以定义立即执行的匿名函数:

(function () { /* do something */ })()

你能在 PHP 中做类似的事情吗?

6个回答

对于 PHP 7 之前的版本,我能想到的立即执行它们的唯一方法是

call_user_func(function() { echo 'executed'; });

使用当前版本的 PHP,您可以这样做

(function() { echo 'executed'; })();
除非(或,直到)函数调用链被引入,这也是我的建议。
2021-03-30 00:12:10
@BennettMcElwee 让我们这样说:即使这比定义分配调用替代方案的执行速度稍慢,这在您的应用程序中构成重大瓶颈的可能性也非常低。如有疑问,请在现实世界条件下分析您的应用程序。
2021-03-31 00:12:10
谢谢@Gordon,这就是我的想法。我的印象是 Salathe 和 yes123 对这种方法不满意,我想知道为什么。对我来说似乎很好。
2021-04-03 00:12:10
@yes123 不。还是得用call_user_func
2021-04-05 00:12:10
@Gordon:php 5.4 还是什么都没有?
2021-04-09 00:12:10

PHP 7javascript 中做同样的事情

$gen = (function() {
    yield 1;
    yield 2;

    return 3;
})();

foreach ($gen as $val) {
    echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;

输出是:

1
2
3

当然你可以使用call_user_func,但还有另一个非常简单的选择:

<?php
// we simply need to write a simple function called run:
function run($f){
    $f();
}

// and then we can use it like this:
run(function(){
    echo "do something";
});

?>
他们不能run在代码的其他部分调用你的函数,因为在立即执行它的行之后没有你的函数的句柄。
2021-03-18 00:12:10
我想要一个立即执行的函数,因为我定义的函数在正常执行中不应被多次调用。像您一样定义命名函数 run() 的问题在于,其他任何看到代码的人都可能认为他们也可以在代码的其他部分调用 run()。立即执行函数清楚地表明这段代码不应运行两次。
2021-03-30 00:12:10
@DanielHoward 重点run()是立即执行传递给它的未命名函数。与 相同call_user_func(),仅不传递参数。
2021-03-30 00:12:10
@JordanLev,“更简单的实现”是指函数内部代码runcall_user_func. call_user_funcrun因为run只做一件事相比有一个固有的缺点,而call_user_func除了做什么之外还支持其他功能run您可以尝试快速循环测试(例如)以查看哪个在您的引擎上更快。
2021-04-05 00:12:10
@JordanLev,它有一个更简单的实现(只有一行:),$f();如果您使用的引擎没有针对call_user_func只有一个函数参数的特殊情况进行优化,那么它可能会更快这是因为call_user_func支持传递多个参数,并且它的第一个参数支持字符串作为参数或函数。也就是说,如果call_user_func可读性很强,run除非代码位于金字塔底部的某个地方,否则我不会使用
2021-04-14 00:12:10

这是最简单的 PHP 7.0 或更高版本。

(function() {echo 'Hi';})();

这意味着创建闭包,然后通过“()”将其作为函数调用。由于统一的变量评估顺序,就像 JS 一样工作。

https://3v4l.org/06EL3

很好的答案,但为什么要将其格式化为命令行操作?
2021-03-20 00:12:10
(new ReflectionFunction(function() {
 // body function
}))->invoke();
你能提供更多细节吗?也许添加一个解释?
2021-03-23 00:12:10