PHP数组参考替换

时间:2019-06-10 17:51:47

标签: php

我有以下代码

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?

2 个答案:

答案 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),将会看到$a8

然后将$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()

Demo

$arr[] = &$a;表示使$arr[1]指向与$a相同的数据。

$arr[1] = $b;表示将$b的值分配给$arr[1],该值为8,并且$a链接到$arr[1],所以$a也是8。

选中What References Do