zoukankan      html  css  js  c++  java
  • php的循环与引用的一个坑

    上代码

    $arr = array(
        'a'=> 'a11',
        'b'=> 'b22',
        'c'=> 'c33',
    );  
    foreach ($arr as $k=>&$v){
        // Do somethind
    }
    foreach ($arr as $k=>$v){
        var_dump($v);
    }

    这样的代码, var_dump 会输出什么?  各位可以试试, 答案

    string(3) "a11"
    string(3) "b22"
    string(3) "b22"

    结果里, 第三行变成了 key='b' 的value.  问题就出在第一个循环的引用.

    今天就踩到了一个这样的坑, 查问题用了很久.  简单来说,  foreach循环使用的引用,  循环结束后有所保留. php.net 着重写了:

    Warning

    Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().

     

    对于上面这个例子,  第一个循环结束后, $v引用仍然存在.  由于两个循环的变量命名一致,  第二个循环开始, $v 每次都会被赋值. 直到最后, $v 被设置成了

    前一个元素的值.

    原理很简单,  文档写的明明白白.  但如果工作中遇到相关的bug是很坑的,  定位需要很久.  还得需要写码的时候就注意:

    1. 减少引用的使用

    2. 如果需要在foreah使用引用,  应该用函数将封装起来

  • 相关阅读:
    Repeater嵌套,增删改查综合运用
    DataSet用法(三) 操作数据
    创建DataSet
    DataSet用法(一)
    DataSet使用方法
    DataSet用法(二)
    Repeater嵌套绑定Repeater
    DataBinder.Eval用法
    简单谈谈DataSet与DataTable的区别
    Repeater嵌套的两种方案
  • 原文地址:https://www.cnblogs.com/c9com/p/5180410.html
Copyright © 2011-2022 走看看