首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:通过引用赋值数组元素变量的副作用

问PHP:通过引用赋值数组元素变量的副作用
EN

Stack Overflow用户
提问于 2015-02-03 01:11:51
回答 1查看 142关注 0票数 2

我想知道通过引用赋值PHP变量的副作用是如何在幕后工作的(注意,我问的是变量赋值,而不是通过引用传递参数给函数;就像在C++中一样,这两者可以是不同的,PHP已经在幕后分别编写了这两个操作)。

基本上,我是在寻求以下几点的解释:

代码语言:javascript
复制
$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。为什么?

EN

回答 1

Stack Overflow用户

发布于 2015-02-03 01:22:50

要了解这些副作用是如何起作用的,请考虑以下代码片段:

代码语言:javascript
复制
$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已经介绍了),它的答案中的示例与这个示例的开头相同,尽管提出的问题不同:

注:在图表中,橙色链接的行为使得当指向数组元素所属的数组被分配时,数组副本中相应的数组元素将指向具有 copy -on-write disabled的相同位置。另一方面,黑色链接指示当数组元素被赋值时,该值将被复制到新的存储器位置(copy-on-write):

​

​

​

​

​

​

为了说明我的观点,下面是程序的输出:

代码语言:javascript
复制
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)
}

请注意。此特性仅在将引用赋值给数组元素时发生,如以下简单的代码片段所证实的那样:

代码语言:javascript
复制
// 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

它会按照预期输出以下内容:

代码语言:javascript
复制
int(222)
int(222)
int(333)
int(333)
int(333)
int(333)
int(444)
int(555)

下面是在上面的标量情况下发生的事情:

​

​

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28283021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档