PHP:通过引用分配数组元素变量的副作用

标签 php reference variable-assignment internal assign

我想知道通过引用分配 PHP 变量的副作用是如何在幕后工作的(注意,我问的是变量分配,而不是通过引用函数传递参数;就像在 C++ 中一样,两者可以有所不同,PHP 在底层分别对这两个操作进行了编程)。

基本上,我正在寻求以下解释:

$a = array(111, 222, 333);
$dummyReferenceVariable = &$a[0];
$b = $a;
$b[0] = "change everything: both a[0] and b[0]";

创建虚拟变量后,分配给 $b[0] 将改变 $a[0],即使 $dummyReferenceVariable > 从未使用过。为什么?

最佳答案

要了解此类副作用如何发挥作用,请考虑以下代码片段:

$a = array(111, 222, 333);
$b = $a;
$b[0] = 999;

var_dump($a, $b);

$dummyReferenceVariable = &$a[0]; 

$dummyReferenceVariable = 444;

var_dump($a, $b);

$c = $a;
$d = $b;

var_dump($a, $b, $c, $d);

$a[0] = 555;
$b[0] = 666;
$c[0] = 777;
$d[0] = 888;

var_dump($a, $b, $c, $d);

我将用下图说明幕后发生的情况(当数组按值分配时内部发生的情况已由 this post 涵盖),其答案中的示例与此示例相同,尽管问题问的是一个不同的问题:

注意:在图中橙色链接的行为是,当分配指向数组元素所属的数组时,数组副本中相应的数组元素将指向与相同的位置禁用写入时复制。另一方面,黑色链接表示当分配数组元素时,该值将被复制到新的内存位置(写入时复制):

enter image description here

enter image description here

enter image description here

为了阐明我的观点,这里是程序的输出:

array(3) {
  [0]=>
  int(111)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  int(999)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  &int(444)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  int(999)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  &int(444)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  int(999)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  &int(444)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  int(999)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  &int(777)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  int(666)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  &int(777)
  [1]=>
  int(222)
  [2]=>
  int(333)
}
array(3) {
  [0]=>
  int(888)
  [1]=>
  int(222)
  [2]=>
  int(333)
}


注意。这种特性仅在将引用分配给数组元素时才会发生,如以下简单代码片段所证实:

// ASSIGNING REFERENCE VALUES TO SCALARS (INSTEAD OF ARRAY ELEMENTS) WORK AS EXPECTED:

$a = 111;
$aRef = &$a;

$a = 222;
var_dump($a, $aRef); // 222, 222

$aRef = 333;
var_dump($a, $aRef); // 333, 333

$c = $a;
$d = $aRef;

$c = 444;
$d = 555;

var_dump($a, $aRef, $c, $d); // 333, 333, 444, 555

按预期输出以下内容:

int(222)
int(222)
int(333)
int(333)
int(333)
int(333)
int(444)
int(555)

以下是上述标量情况下发生的情况:

enter image description here

关于PHP:通过引用分配数组元素变量的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28283021/

相关文章:

php - 为什么 ORDER BY 子句中的绑定(bind)参数不对结果进行排序?

c++ - 在 C++ 中使用引用和指针有什么意义?

javascript - 在 Javascript 中按值传递变量

arrays - scala中非元组的多重赋值

php - 将值存储在 session 变量中并对该值进行查询是否安全?

php - 德语的 DateTime::format(星期几)

python - 将多个变量分配给同一值的最优雅方法?

php - 在 PHP 中将单值数组转换为变量的快速方法?

php - 动态添加方法到 stdClass 对象

python - python 中的大型对称列表 : will references contribute to size in ram?