CodeIgniter传数据给视图必须通过$this->load->view()第二个参数传递关联数组,键名转为变量名;对象需转数组,嵌套视图需手动传参或返回字符串拼接;CI4已废弃该方式,改用return view()且语法不兼容。

CodeIgniter 传数据给视图只能用 $this->load->view() 的第二个参数
不是所有地方都能直接 echo 或 return 视图内容,CodeIgniter 的视图渲染强依赖控制器里 $this->load->view() 的调用方式。它的第二个参数必须是数组,键名会自动转成视图里的变量名。
- 错误写法:
$this->load->view('user/list', $data)中$data是对象或字符串 → 视图里变量全失效 - 正确结构:必须是关联数组,比如
['users' => $users, 'title' => '用户列表'] - 如果从模型拿到的是对象数组(如
stdClass),得先用json_decode(json_encode($obj), true)转成数组,或者在模型里就用result_array()替代result() - 别在视图里再调用
$this->load->view()传参——嵌套视图不能靠这个二次传数据,得靠主视图把所有需要的数据一次性塞进去
CodeIgniter 视图里访问不到变量?检查是否被 $this->load->view() 外层覆盖
常见现象是视图里 $title 显示空白,但控制器明明传了。问题往往出在「重复加载」或「作用域覆盖」上。
- 控制器中写了两次
$this->load->view(),第二次没传参或传了空数组,会清掉前一次的变量绑定 - 用了
$this->load->view('header')单独加载公共头,但没传任何参数 → 它内部无法访问主视图传入的变量,因为每个view()调用是独立作用域 - 解决办法:把共用数据统一塞进主视图参数;或者改用
$this->load->view('header', $data, TRUE)第三个参数设为TRUE返回字符串,再手动插入到主视图中 - 注意:
TRUE返回的是字符串,不是输出,别漏了echo或拼接到主视图变量里
CodeIgniter 4 和 CI3 在视图传参上不兼容
如果你从 CI3 迁移到 CI4,$this->load->view() 这套机制已经彻底废弃,直接报错。
- CI4 必须用
return view('user/list', $data),且$data可以是数组或对象,但对象属性需 public 才能被模板读取 - CI4 的视图是 Twig 风格语法(
= $title ?>或=$title ?? '默认值'?>),不支持 CI3 那种裸变量写法外的额外解析逻辑 - CI3 的
$this->load->vars()全局变量注入,在 CI4 里对应的是ViewRenderer::setVar(),但只对当前请求生命周期有效,不能跨方法复用 - 升级时最容易踩的坑:把 CI3 的
$this->load->view('xxx', $data)直接复制到 CI4 控制器里,结果整个页面白屏,错误日志里只有「Call to undefined method」
大数组传给视图导致内存溢出或响应慢?别一股脑全塞进去
尤其是分页列表页,查了 1000 条记录再传给视图,实际只渲染前 20 条,其余数据纯属浪费。
- 查库时就用
limit(20)->offset(0)控制数量,别用get()->result()拉全量再 array_slice - 分页信息、总数这些辅助数据,单独封装成小数组传入,不要和主数据混在同一个键下
- 如果真要传大量结构化数据(比如树形菜单),考虑在视图里用 AJAX 异步加载,而不是初始化就压进 PHP 变量
- CI3 默认开启
$autoload['libraries'] = ['session']时,如果 session 数据本身很大,再叠加视图参数,容易触发 PHP 内存限制 —— 检查php.ini的memory_limit是否仍为默认 128M









