• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

PHP传递使用foreach引用赋值&问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

代码:

 

  1.  
    $test=array('a','b','c');
  2.  
     
  3.  
    foreach($test as &$value){
  4.  
    echo $value;
  5.  
    }
  6.  
    echo $value;
  7.  
     
  8.  
    foreach($test as $value){
  9.  
    echo $value;
  10.  
    }
  11.  
    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相当于新的变量,不会导致上述问题。这也是一个很好的编程习惯。

实验:

 

  1.  
    $test=array('a','b','c');
  2.  
     
  3.  
    foreach($test as &$value){
  4.  
    //对$value进行操作
  5.  
    }
  6.  
    var_dump($test);

 

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

 

array (size=3)
  0 =>  'a' (length=1)
  1 =>  'b' (length=1)
  2 => & 'c' (length=1)

大家有木有发现,元素'c'的前面有个赋值引用符号’&‘,原因就在这里。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap