Laravel Blade模板foreach循环结束后外部调用$item仍返回最后一条数据
问题原因
该现象是PHP原生foreach的固有特性,和Blade模板引擎的实现无关。
PHP中使用foreach ($遍历对象 as $循环变量)的写法时,循环结束后循环变量不会被自动销毁,会保留最后一次循环时被赋值的内容,你遇到的「循环外打印$item得到最后一条模型数据」就是这个特性导致的。
可以用原生PHP代码复现该问题:
<?php $collection = [ (object)['id' => 1, 'nom' => '选项1'], (object)['id' => 2, 'nom' => '选项2'], (object)['id' => 3, 'nom' => '选项3'], ]; foreach ($collection as $item) { echo $item->nom; } // 循环结束后打印$item,会输出id=3的对象 var_dump($item);
解决方法
- 循环结束后手动销毁变量,在
@endforeach之后添加一行@php unset($item); @endphp即可,之后再调用$item就会返回未定义状态,符合你的预期。 - 尽量不要依赖循环作用域外的
$item变量做业务逻辑判断,Laravel 5.3及以上版本的Blade提供了内置的$loop变量,可以满足绝大多数循环内的状态判断需求。 - 如果你后续用到引用传递的
foreach写法(形如foreach ($collection as &$item)),更要注意必须在循环结束后手动unset引用变量,否则后续对$item的赋值会直接修改原集合的最后一条数据,引发更隐蔽的业务bug。
内容的提问来源于stack exchange,提问作者jurandou
相关产品推荐
相关产品推荐

