CodeIgniter中foreach循环传对象至视图,为何二次迭代仍输出2?
问题原因与解决方案
问题本质
这不是对象内存地址共享的问题,而是CodeIgniter视图加载的变量复用机制导致的:
当调用$this->load->view()时,传递的变量会被存入视图的全局变量池,而非每次加载都清空变量池。第一次加载view2时,你传入了包含$b=2的对象,变量$b被存入变量池;第二次加载view2时未传递任何变量,视图会直接复用变量池中已存在的$b,因此仍然输出2。
代码问题拆解
- 控制器中
$result的定义存在语法细节:将数组强制转为对象时,数组索引会成为对象的属性名,因此$result实际是包含->0和->1两个属性的对象,这部分可正常遍历,但不是核心问题。 - view1中第二次加载view2时未传递变量,导致视图复用旧变量。
修复方案
方案1:每次加载视图时明确传递变量(推荐)
修改view1的循环逻辑,无论是否有数据都传递变量,覆盖旧值:
<?php foreach($result as $index => $res) { // 每次都传递变量,无数据时传空数组清空旧变量 $this->load->view("view2", $res ?? []); } ?>
方案2:在view2中检查变量是否存在
修改view2,避免输出未定义的旧变量:
echo isset($b) ? $b : '';
方案3:重置视图变量池
如果需要彻底清空之前的变量,可以在加载视图前调用$this->load->clear_vars():
<?php foreach($result as $index => $res) { $this->load->clear_vars(); // 清空之前的视图变量 $this->load->view("view2", $res ?? []); } ?>
内容的提问来源于stack exchange,提问作者D L
相关产品推荐
相关产品推荐

