foreach陷阱

<?php

$nums = [1, 2, 3];
foreach ($nums as &$num) {
    $num += 1;
}
unset($num);
var_dump($nums); // 2,3,4

foreach ($nums as $num) {
    echo $num . "\n"; // 2,3,3
}
var_dump($nums); // 2,3,3

/**
 * 以上的原因,因为 &$num 没有进行销毁
 * 数组最后应该元素的$num引用在循环后仍然会保留,所以建议unset掉
 */
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 7
aab

感觉最好的办法就是不用,就像 ++$i++ 这样的东西一样。不过有一个关于 foreach 自动销毁引用的提案,好像因为边界问题太多,被撤回了externals.io/message/115702#115718

1个月前 评论

这个问题虽然很反逻辑,但是好像挺符合引用的原理

1个月前 评论

:stuck_out_tongue_closed_eyes: 看到标题就猜到了可能是 &$value
其实官网有写关于 foreach 的引用问题
PHP: foreach - Manual

1个月前 评论
laradocs

标题为 《foreach 的写法陷阱》 比较好。

1个月前 评论
陈先生

养成习惯,每次 foreach 后,无论是否是指针引用,都应该 unset

1个月前 评论

这样子可以解决

<?php

$testArray = [1,2,3];

foreach ($testArray  ?? [] as &$num) {

}

foreach ($testArray ?? [] as $num) {

}

var_dump($testArray);
1个月前 评论

@steffenkong 这样不能解决,为什么加上 ??后, 引用会失效?(即改变第一个foreach里面$num的值,然后$testArray的值没变)

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!