CI3中$this->load->view()传参必须为关联数组,否则视图变量不可用;CI4改用view()函数且控制器方法必须return,路径相对于application/views/且不加.php扩展名。

CI3 中 $this->load->view() 传参必须是关联数组
传对象、索引数组或 null 会直接导致视图里 $name 变量不可用,甚至报 Undefined variable。框架内部用 extract() 解包数据,只认键名明确的关联结构。
常见错误现象:$data = [0 => 'admin', 1 => 'user'] → 视图中 $0 不合法;$data = new StdClass() → $name 访问不到。
- 必须写成
$data = ['username' => 'admin', 'role' => 'user'] - 若只有对象,先强转:
$data = (array) $user - 键名避开
class、function、__construct、$this等 PHP 保留字,否则 extract 失败静默丢弃
CI4 的 view() 函数不接受 $this->load,且必须 return
CI4 彻底废弃了 CI3 的加载器模式,$this->load->view() 会抛出 Fatal error: Call to undefined method。新写法是全局函数 view(),且控制器方法必须显式 return,否则页面空白。
常见错误现象:复制 CI3 代码到 CI4,控制器里写 $this->load->view('home', $data) → 直接 500;或写了 view('home', $data) 却没 return → 响应体为空。
- 正确写法:
return view('pages/home', ['title' => 'Home']); -
view()路径大小写敏感,'Pages/Home'会 404 - 不支持第三个布尔参数(CI3 的
TRUE返回字符串模式),CI4 默认返回字符串,靠return输出
子视图路径不是相对当前文件,而是相对于 application/views/
在主视图里用 $this->load->view()(CI3)或 view()(CI4)加载子视图时,路径基准永远是 application/views/,不是当前视图所在目录。误写成 'sidebar' 而非 'admin/sidebar' 是最常触发 Unable to load the requested file 的原因。
使用场景:你在 application/views/admin/dashboard.php 里想加载同级的 sidebar.php。
- ✅ 正确:
$this->load->view('admin/sidebar')(CI3)或echo view('admin/sidebar')(CI4) - ❌ 错误:
$this->load->view('sidebar')(找不到)、$this->load->view('/admin/sidebar')(开头斜杠触发绝对路径查找) - CI4 中不能省略扩展名,但也不加
.php—— 写'admin/sidebar'即可,框架自动匹配.php
为什么视图什么都没输出?多半是漏了 return 或没接住返回值
$this->load->view()(CI3)默认返回渲染后的字符串,不自动 echo;view()(CI4)也一样。控制器里只调用、不 return 或 echo,内容就丢了。这不是 bug,是设计如此。
容易踩的坑:
- CI3 控制器里写了
$this->load->view('welcome')却没后续echo或return→ 页面空白 - CI3 想复用渲染结果做二次处理,却忘了接住:
$html = $this->load->view('partial', [], TRUE)(第三个参数必须为TRUE) - CI4 忘记
return,或在return前执行了重定向、header 设置,导致响应已发送无法再输出
复杂点在于:CI3 开启 profiler 后可能掩盖真实输出行为,调试时建议先关掉 $this->output->enable_profiler(FALSE);CI4 则要确认是否在中间件或过滤器里提前终止了响应流。











