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
}
解释:
- PHP 中的引用不同于 C 中的引用,C 中的引用是取址,PHP 中是将两个变量关联,指向同一块内存,操作其中一个也相当于操作了另一个。
- 以上代码中,第一次 foreach 中使用了引用,循环结束后,引用没有及时取消,$val 与 $arr[4] 绑定。
- 第二次 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(换个变量)。