PHP 数组复制语义:当成员被引用时它做什么,以及它在哪里记录


PHP array copy semantics: what it does when members are references, and where is it documented?

此代码

<?php
$a = 10;
$arr1 = array(&$a);
$arr1[0] = 20;
echo $a; echo "'n";
$arr2 = $arr1;
$arr2[0] = 30;
echo $a;

生产

20
30

显然,引用数组成员被"保留",例如,这可能导致一些有趣/奇怪的行为,例如

<?php
function f($arr) {
    $arr[0] = 20;
}
$val = 10;
$a = array(&$val);
f($a);
echo $a[0];
?>

输出

20

我的问题是:它的用途是什么,它在哪里记录(除了 http://www.php.net/manual/en/language.types.array.php#50036 的用户评论)和 Zend Engine 源代码本身?

PHP 的引用行为赋值记录在手册页"PHP: What Reference Do"中。您还会在那里找到有关数组值引用的段落,开头为:

虽然不是严格意义上的引用赋值,但使用语言构造 array() 创建的表达式也可以通过前缀和要添加的数组元素来表现

该页面还解释了为什么您的第一个代码的行为方式如下:

但请注意,数组中的引用具有潜在的危险。在右侧使用引用执行普通(不是通过引用)赋值不会将左侧变成引用,但数组内的引用保留在这些正常赋值中。这也适用于按值传递数组的函数调用。