为什么使用数组引用调用PHP函数的这种较短方式会导致不同的结果?

Dan*_*ien 2 php pass-by-reference

如果函数my_func定义为:

function my_func(&$arr) {
    array_push($arr, 0);
    array_push($arr, 1);
    array_push($arr, 2);
    array_push($arr, 3);
    array_push($arr, 4);
}
Run Code Online (Sandbox Code Playgroud)

如果我my_func按如下方式调用,则结果如预期:

$test_array = array();
my_func($test_array);
print_r($test_array);
Run Code Online (Sandbox Code Playgroud)

结果是:

Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
)

我想我可以通过调用my_func如下来缩短这段代码:

my_func($test_array = array());
print_r($test_array);
Run Code Online (Sandbox Code Playgroud)

但是,结果会发生变化:

Array
(
)

为什么这个较短的代码段会导致不同的结果?

pha*_*t0m 5

您不是通过引用传递变量,而是传递表达式的值.

如果要启用所有错误,您将看到以下消息:

Strict Standards: Only variables should be passed by reference in 
Run Code Online (Sandbox Code Playgroud)

赋值的值是自己赋值的值.它是传递给数组的值 - 数组的副本my_func.

关于此事PHP文档更强烈地说明了这一点:

不应该通过引用传递其他表达式,因为结果是未定义的.

结论:只有不断传递变量($x,$x[0],$x->a),新对象或引用从函数返回期待的引用的功能.