美文网首页
PHP使用引用(&)时的一个小陷阱

PHP使用引用(&)时的一个小陷阱

作者: 留白o_O | 来源:发表于2017-08-24 23:37 被阅读26次

    描述:

    $arr的为一个已知数组,$res为一个空数组。
    先对 $arr 中每个值+1,打印$arr;再将 $arr 的每个元素分别传递给数组 $res,打印$res。

    错误示例实现:

    <?php
    $res = array();
    $arr = array(0, 1, 2, 10, 34);
    foreach ($arr as &$val) {
        $val += 1;
    }
    var_dump($arr);
    foreach ($arr as $val) {
        $res[] = $val;
    }
    var_dump($res);
    

    结果分别为:

    array(5) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
      [3]=>
      int(11)
      [4]=>
      &int(35)
    }
    array(5) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
      [3]=>
      int(11)
      [4]=>
      int(11)   //11 不是想要的,期望的是 35
    }
    

    解释:

    1. PHP 中的引用不同于 C 中的引用,C 中的引用是取址,PHP 中是将两个变量关联,指向同一块内存,操作其中一个也相当于操作了另一个。
    2. 以上代码中,第一次 foreach 中使用了引用,循环结束后,引用没有及时取消,$val 与 $arr[4] 绑定。
    3. 第二次 foreach 中,每次循环 $val = $arr[i] (i 指对应的索引值)(arr[4] 同
      $val)。
    $val = $arr[0] ;//$arr[0] 为 1
    $val = $arr[1] ;//$arr[1] 为 2
    $val = $arr[2] ;//$arr[2] 为 3
    $val = $arr[3] ;//$arr[3] 为 11,此处 $val 变为 11,即 $arr[4] 也为 11
    $val = $arr[4] ;//$arr[4] 为 11,此处 $val 仍为 11
    

    处理方法:

    第一次 foreach 后,及时 unset($val),或者不要使用 $val(换个变量)。

    相关文章

      网友评论

          本文标题:PHP使用引用(&)时的一个小陷阱

          本文链接:https://www.haomeiwen.com/subject/zkeydxtx.html