通过引用分配PHP的误解
作者:互联网
在下面给出的代码中,$arr [0]结果“ 2”的含义是什么,$arr2正在复制$arr并将其第一个值增加一个,因此$arr2 [0]“ 2”的结果很明显,但是是什么呢?发生在$arr上时,当我像$a =& $arr [0]这样将引用$arr [0]传递给$a时,当我将$arr [0]传递给值$a =时,$arr [0]的结果为2 $arr [0 [$arr [0]的结果应设置为1,有人可以启发我吗?
<?php
$a = 1;
$arr = array(1);
$a = &$arr[0];
$arr2 = $arr;
$arr2[0]++;
echo $arr[0]. "<br>";//2
echo $arr2[0]. "<br>";//2
?>
解决方法:
PHP中的引用不同于指针.当您通过引用分配或传递某些内容时,会创建我们称为“引用集”的内容,其中两个变量都是对同一“ zval”(内存中保存变量的类型和值的结构)的引用.
一个重要的后果是引用是对称的.我倾向于将引用分配写为$foo =& ;; $bar而不是$foo =& $bar强调了这一点:运算符不仅引用$bar并将其放入$foo,还会影响两个操作数.
考虑到这一点,让我们看一下您的示例:
$arr = array(1);
这将创建两个zval:一个用于$arr数组本身,另一个用于该数组位置0($arr [0])中的值.
$a =& $arr[0];
这会将$a和$arr [0]绑定到参考集中.无论使用哪种名称,我们都将使用与先前创建的zval相同的zval,目前拥有1.
$arr2 = $arr;
这会将$arr的内容复制到新的数组zval $arr2中.但是它不会将数组中的引用解析为值,而只是复制它们是引用的事实.
因此,$arr2 [0]现在也是包含$arr [0]和$a的引用集的一部分.
$arr2[0]++;
这会将参考集所指向的zval从1增加到2.
echo $arr[0]. "<br>";//2
echo $arr2[0]. "<br>";//2
由于它们都是同一参考集的一部分,因此它们都指向相同的zval,它是整数2.
不可避免的问题是“错误还是功能?”一个更有用的示例是将包含引用的数组传递给函数:
function foo($array) {
$array[0] = 42;
$array[1] = 69;
}
$a = 1;
$b = 1;
$foo = [ &$a, &$b ];
foo($foo);
echo $a; // 42
echo $b; // 69
像赋值一样,传递给函数不会破坏引用,因此操纵它们的代码可以安全地重构为多个函数.
标签:pass-by-reference,php 来源: https://codeday.me/bug/20191025/1926095.html