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

2017-08-24  本文已影响26人  留白o_O

描述:

$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(换个变量)。

上一篇下一篇

猜你喜欢

热点阅读