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

时间:2011-05-20 13:15:38

标签: php arrays reference copy

此代码

<?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源代码本身?

1 个答案:

答案 0 :(得分:3)

参考行为的PHP分配记录在manual page "PHP: What References Do"上。你也会在那里找到一个关于数组值引用的段落,从:

开始
  

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

该页面还解释了您的第一个代码行为的原因:

  

但请注意,数组内部的引用可能存在危险。使用右侧的引用执行正常(非引用)赋值不会将左侧转换为引用,但是在这些正常赋值中保留数组内的引用。这也适用于通过值传递数组的函数调用。