PHP数组引用替换

PHP数组引用替换,php,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 functio

我有以下代码

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>';
}

问:为什么索引1上的值没有替换为$b变量的值,但仍然有引用?即使在调用$arr[1]=$b之后,引用仍然存在;如果没有封盖?

这里有一个简单的解释:

$arr[1] = $b; // Index 1 references variable $a so $a will become 8
然后指示代码更改索引1引用的变量的值,以保持与
$b
相同的值,即
8

$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
如果现在执行
var\u dump($a)
,您将看到
$a
8

然后增加
$a
$b
,此时它们的值相同。它们现在都将具有值
9

末尾数组的内容与最初指定的内容相同。唯一的区别是,索引为1的元素引用的变量现在具有不同的值


通过引用指定时,会在两者之间创建链接,它们指向相同的结果。因此,当您进行另一个赋值时,它也会赋值给引用的变量。如果您检查
$a
,您将看到它先变为8,然后变为9。要中断引用,请使用
unset()

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

$arr[1]=$b
表示将
$b
的值分配给
$arr[1]
,即8,
$a
链接到
$arr[1]
,因此
$a
也是8


检查

它被替换,首先是8,然后是9。@u\u mulder是的,但我调用$arr[1]=$b;但是数组中仍然有一个引用。我不是在打$arr[1]=&b;在索引上设置新引用。
echo$a
你会看到的。也许我不能清楚地说明我的问题,因为我的英语不好,但我想知道,为什么在我调用$arr[1]=$b后,数组中索引1上仍然有引用;(这是一个值段,不是一个引用,对吗?)当您分配一个引用时,它会在两者之间创建一个链接,因此当您进行另一个分配时,它也会分配给被引用的变量。这就是为什么我说echo
$a
你会看到它变为8,然后变为9。要中断参考,请使用
取消设置
.thx进行解释。我只是感到困惑,为什么我要调用$arr[1]=$b;数组的索引1不仅仅是$b的值,如果我想继续引用另一个变量,我希望调用$arr[1]=&$b@带索引1的元素只指向变量
$a
,因此当您执行
$arr[1]=$b
它的基本意思是
$a=$b
;当您执行
$arr[1]=&$b告诉PHP,索引为1的元素现在指向另一个变量。该索引现在将指向与变量
$b
相同的内存位置。如果您不能围绕引用进行思考,请将其视为别名
$arr[1]=&$a
表示
$arr[1]
$a
的别名。变量的名称不同,但内存位置相同。thx供您解释。我只是感到困惑,为什么我不需要调用$arr[1]=&$b;要更改引用变量,它不会更改引用变量,
$arr[1]
仍然是对
$a
的引用。分配
$b
时,它只分配
$b
的值,即8。
$arr[1] = $b; // Index 1 references variable $a so $a will become 8
$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