问题是什么?
PHP 在 循环中 引用 如果处理不当会出现一些 bug。
如何复现问题
这个哥们讲的真的好。
里面有一句话是重点:
所以在后面给 $v 赋值时, 其实改变的是 arr 数组的最后一个元素,所以是最后一个元素一直在引用赋值。
通篇阅读他的文章,他的文章没有废话,讲的很细,值得一看。
文章的地址:
https://www.cnblogs.com/sunshineliulu/p/12853531.html
我的思考
先说下情况
我正好在读 PHP 文档,恰巧注意到 引用传值 的问题。
但是没有搞懂到底是啥问题。文档给的解决方案是:unset()
不需要使用的变量。
$arr = [
'a', 'b',
'c', 'd',
];
foreach ($arr as &$each){
....
}
// 每次在使用完 $each 后,都要立即 unset 防止后续出现 本文所说的 bug
unset($each);
背后的原理
因为 PHP 的变量名其实就是 标识符,只是起标识作用。所以上例中 循环 $arr 时会出现:
//第一次循环
$arr[0] === 'a' == $each
//第二次循环
$arr[1] === 'b' == $each
....
'a' 和 $each 之间的关系就是 $each 是指向 'a' 的,又因为 $arr[0] 也是指向 'a' , 所以$each == $arr[0]。
下一次循环时, 同理。
最后一次循环完成后, $arr[n] == $each;
又因为 $each 没有被销毁,所以如果我们进行重新循环的时候,如果 $each 的值发生改变,那么 $arr[n] 的值也会发生改变。
综上,这就是本次问题的原理的全部内容了。不知道我理解的对不对,如果不对,请说出你的理解。
如何解决
- 每次使用完引用后,直接 unset
- 确保自己不会使用同名变量,如果使用的话,明确知道这个变量的值是否是自己的期望值
评论 (0)