转-PHP —— 为什么不要在 FOREACH 中使用变量引用

最近在浏览同事之前写的代码的时候,发现大量的变量引用使用在 foreach 中:

$a = array( ‘a‘, ‘b‘, ‘c‘, ‘d‘);
foreach($a as &$v) {
    $v = $v . ‘_bar‘;
}
var_dump($a);

这种写法有个好处,就是可以直接通过改变引用变量 $v 的值,来直接改变数组的值。但是显然,这里会带来一个问题:

$a = array('a', 'b', 'c', 'd');
foreach($a as &$v) {
    $v = $v . '_bar';
}
$v = 'foobar';
var_dump($a);

通常 foreach 变量都只希望是一个作用域在 foreach 内部的局部临时变量。但是当不慎在后面用了同名的临时变量时,数组的内容会不预期的被改变。就如同上面的代码那样,最终结果 $a[3] = ‘foobar’ 而不是预期的 $a[3] = ‘d_bar’。这对于程序的正确执行时一个隐患,不能让程序的正确性维系在程序员足够细心的不使用重名临时变量,这一线上。

解决方法有两种。

第一种,直接使用数组的键值来修改数组内容:

$a = array('a', 'b', 'c', 'd');
foreach($a as $k => $v) {
    $a[$k] = $v . '_bar';
}
$v = 'foobar';
var_dump($a);

第二种,注销掉 foreach 中使用的临时变量:

$a = array('a', 'b', 'c', 'd');
foreach($a as &$v) {
    $v = $v . '_bar';
}
unset($v);
$v = 'foobar';
var_dump($a);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值