PHP 循环 引用 会遇到的坑

梦浪的小虾米
2021-02-18 / 0 评论 / 231 阅读 / 正在检测是否收录...

问题是什么?

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] 的值也会发生改变。
综上,这就是本次问题的原理的全部内容了。不知道我理解的对不对,如果不对,请说出你的理解。

如何解决

  1. 每次使用完引用后,直接 unset
  2. 确保自己不会使用同名变量,如果使用的话,明确知道这个变量的值是否是自己的期望值
0

评论 (0)

取消