PHP中函数参数的求值顺序


Order of evaluation of function arguments in PHP

是否保证PHP函数参数的评估顺序始终相同?

谢谢。

通常是。如手册所述:

[Function]参数从左到右求值。

但是有两种极端情况参数根本不求值:

<标题> 未定义的功能
$calls = 0;
register_shutdown_function(function () use (&$calls) {
    echo $calls;
});
func_does_not_exist($calls++);

在所有PHP版本上输出0

缺少构造函数,未定义函数

的特殊情况
class Foo {}
$bar = 0;
$foo = new Foo($bar++);
echo $bar;

PHP输出0 <7.1, 1在PHP>= 7.1。它被称为"Rasmus优化",它只发生在构造没有正式构造函数的类的情况下。另见#67829,#54162和#54170。


总之,手册是正确的。对于已定义的函数,从左到右计算参数,然后传递给函数。未定义的函数,对于不存在的构造函数是一种特殊情况,不符合函数的条件,因此调用前的求值本身是未定义的。

从手册:

信息可以通过实参列表传递给函数,实参列表是一个逗号分隔的表达式列表。参数从左到右求值。

理论上它可能会在未来的PHP版本中改变,但我肯定不希望它改变。

(请不要写任何依赖于它的代码,为了每个人…)