2014-09-22 101 views
2
$array1=array(1,2); 
$x=&$array1[1]; 
$array2=$array1; 
$array2[1]=22; 
print_r($array1); 

输出:引用数组元素的变量如何影响从第一个数组创建的另一个数组?

Array 
(
    [0] => 1 
    [1] => 22 
) 

$array2只是复制从$array1新址,它不引用到$array1的价值,所以改变$array2[1]不应该改变$array1。如果我删除第二行$x参考$array1[1]那么它的行为正常。 $array2[1]$x不指向相同的地址。那么$x如何影响$array2[1]?根据php.net文档

回答

2

然而,阵列内的引用是潜在的危险。做一个正常的(不是通过引用)赋值和右侧的引用不会将左侧变为引用,但是这些正常赋值中保留了数组内的引用。这也适用于按值传递数组的函数调用

换句话说,数组的引用行为是以元素为单位定义的;单个元素的引用行为与数组容器的引用状态分离。

看到php.net文件:

Link

0
$array1=array(1,2); 

在$ ARRAY1第二元件的这一行的zval后似乎是这样的:(is_ref => 0,引用计数=> 1,...)

$x=&$array1[1]; 

此线设置is_ref字段中的zval成1(真)和引用次数为2(1 + 1)

$array2=$array1; 

此行集引用计数中的zval为3(2 + 1),is_ref仍是1(真)

$array2[1]=22; 

在这一行解释器看到is_ref = 1,并认为,想要什么就有什么这个zval的唯一引用 (并且不要在写入时进行复制)。

相关问题