PHP   发布时间:2022-04-05  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了通过引用分配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 =&amp ;; $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

像赋值一样,传递给函数不会破坏引用,因此操纵它们的代码可以安全地重构为多个函数.

大佬总结

以上是大佬教程为你收集整理的通过引用分配PHP的误解全部内容,希望文章能够帮你解决通过引用分配PHP的误解所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: