牛骨文教育服务平台(让学习变的简单)
博文笔记

php在foreach中使用引用赋值&可能遇到的问题

创建时间:2015-12-28 投稿人: 浏览次数:2762

楼主在写项目的时候,由于初涉PHP的赋值引用操作,觉得这个功能非常强大,用时一时爽,没有深入了解过其中的原理,导致了一些当时觉得不可思议的BUG,废话不都说,我举个例子详细的描述一下这个问题。

代码:

$test=array("a","b","c");

foreach($test as &$value){
     echo $value;
}
echo $value;

foreach($test as $value){
     echo $value;
}
echo $value;

运行结果:

"a","b","c"

"c"

"a","b","b"

"b"

解释:

在第一个foreach中,我们使用了赋值引用符号,它的意思是每次遍历时,$value指向的是$test数组中的对应元素的地址,循环一次时,$value指向的是"a"的地址,第二次循环的时候,$test指向的是第二个元素"b"的地址,第三次循环时,指向的就是"c"的地址。当我们在做第二次遍历的时候,其实$value变量指向的还是$test的第三个元素即"c"的地址。然后foreach本身的操作是把数组中对应的元素赋值给as后面的变量,所以在第二个foreach中,遍历第一次的时候,把‘a’赋值给$value指向的地址即["a","b","a"],第二次遍历的时候,把"b"赋值给$value指向的地址即["a","b","b"],第三次遍历的时候,就把"b"赋值给$value指向的地址,这也就是为什么输出结果是["a","b","b"]而不是["a","b","c"]的原因。

解决方案:

在使用完赋值引用操作符之后,把变量unset掉,上例中加上unset($value)语句,相当于取消$value对该地址的引用,这样第二次foreach的时候,$value相当于新的变量,不会导致上述问题。这也是一个很好的编程习惯。

实验:

$test=array("a","b","c");

foreach($test as &$value){
     //对$value进行操作
}
var_dump($test);

大家如果运行一下的话,会发现浏览器打印出来的结构是这样的:

array (size=3)
  0 =>  "a" (length=1)
  1 =>  "b" (length=1)
  2 => & "c" (length=1)
大家有木有发现,元素"c"的前面有个赋值引用符号’&‘,原因就在这里。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。