PHP中函数参数的评估顺序

use*_*092 4 php evaluation operator-precedence

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

谢谢.

bis*_*hop 7

通常,是的.如手册所述:

[功能]参数从左到右进行评估.

但是有两种边缘情况,根本没有评估参数:

未定义的功能

$calls = 0;
register_shutdown_function(function () use (&$calls) {
    echo $calls;
});
func_does_not_exist($calls++);
Run Code Online (Sandbox Code Playgroud)

这将在所有版本的PHP上输出 0.

缺少构造函数,一个未定义函数的特例

class Foo {}

$bar = 0;
$foo = new Foo($bar++);
echo $bar;
Run Code Online (Sandbox Code Playgroud)

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


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