是否保证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版本中改变,但我肯定不希望它改变。
(请不要写任何依赖于它的代码,为了每个人…)