我有以下代码
public function index() {
$a = 2;
$b = 8;
$arr[] = $a;
$arr[] = &$a;
$arr[] = $a;
$this->dmp($arr);
$arr[1] = $b;
$this->dmp($arr);
$a++;
$b++;
$this->dmp($arr);
}
private function dmp($val) {
echo '<pre>';
var_dump($val);
echo '</pre>';
}
这给了我以下结果
array(3) {
[0]=>
int(2)
[1]=>
&int(2)
[2]=>
int(2)
}
array(3) {
[0]=>
int(2)
[1]=>
&int(8)
[2]=>
int(2)
}
array(3) {
[0]=>
int(2)
[1]=>
&int(9)
[2]=>
int(2)
}
问:为什么索引1的值没有被$ b变量的值代替,但是仍然有引用?即使在调用$ arr [1] = $ b之后,该引用仍然存在;没有appersand?
答案 0 :(得分:0)
这里是一个简单的解释:
$arr[0] = $a; // Index 0 holds the same value as $a which is 2
$arr[1] = &$a; // Index 1 holds a reference to variable $a
$arr[2] = $a; // Index 2 holds the same value as $a which is 2
然后,您指示代码更改索引1引用的变量的值,以使其与$b
的值相同,即8
。
$arr[1] = $b; // Index 1 references variable $a so $a will become 8
如果您现在进行var_dump($a)
,将会看到$a
是8
。
然后将$a
和$b
都增加,此时它们具有相同的值。它们现在都将具有值9
最后一个数组的内容与最初指定的内容相同。唯一的区别是元素索引为1的变量现在具有不同的值。
$arr[0] = 2; // Index 0 holds the value 2
$arr[1] = &$a; // Index 1 holds a reference to variable $a which has a value 9 now
$arr[2] = 2; // Index 2 holds the value 2
答案 1 :(得分:0)
当您通过引用分配时,它会在两者之间创建一个 link ,它们指向相同的结果。因此,当您进行其他分配时,它也会分配给引用的变量。如果您检查$a
,将看到它变成8,然后变成9。要破坏引用,请使用unset()
。
此$arr[] = &$a;
表示使$arr[1]
指向与$a
相同的数据。
此$arr[1] = $b;
表示将$b
的值分配给$arr[1]
,该值为8,并且$a
链接到$arr[1]
,所以$a
也是8。