Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:通过引用分配数组元素变量的副作用 我想知道如何通过引用在PHD下分配PHP变量的副作用(注意,我问的是变量赋值,不是通过引用函数传递参数;就像C++一样,两个可以不同,PHP在引擎盖下分别编程了这两个操作)。_Php_Reference_Variable Assignment_Internal_Assign - Fatal编程技术网

PHP:通过引用分配数组元素变量的副作用 我想知道如何通过引用在PHD下分配PHP变量的副作用(注意,我问的是变量赋值,不是通过引用函数传递参数;就像C++一样,两个可以不同,PHP在引擎盖下分别编程了这两个操作)。

PHP:通过引用分配数组元素变量的副作用 我想知道如何通过引用在PHD下分配PHP变量的副作用(注意,我问的是变量赋值,不是通过引用函数传递参数;就像C++一样,两个可以不同,PHP在引擎盖下分别编程了这两个操作)。,php,reference,variable-assignment,internal,assign,Php,Reference,Variable Assignment,Internal,Assign,基本上,我正在寻求以下方面的解释: $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)

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

$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);
我将用以下图表说明引擎盖下发生的情况(当数组按值分配时,内部发生的情况已包含在中),其答案中的示例开始时与此相同,尽管所问的问题不同:

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

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

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)
下面是在上述标量情况下引擎盖下发生的情况:


请不要发布不完整的问题。这是一个很好的开端,所以看起来您正在尝试制定一个规范的问题/答案对。要想让它有用,问题必须是好的,答案也必须是好的。你提出的问题太宽泛了,而且有被关闭的危险。我认为我的回答相对完整。请让我知道我是否遗漏了任何重要的细节,或者是否可以改进。谢谢。如果你能编辑问题使其具体化,它可能会在关闭后继续存在,或者在关闭后重新打开。