CI4视图需用view()函数替代$this->load->view()并显式return,路径改为app/Views/,仅接收$data数组,禁用$this访问和短标签。

CI3 的视图文件在 CI4 中基本能直接复用,但有几处关键改动必须处理,否则会报错或数据不渲染。
view() 函数替代 $this->load->view()
CI4 不再通过控制器实例调用 load 对象加载视图。所有视图渲染必须用全局函数 view(),且它返回的是 HTML 字符串,需显式 return。
- CI3 写法:
$this->load->view('header', $data); - CI4 正确写法:
return view('header', $data);(注意:必须 return,否则空白页) - 若控制器需渲染多个视图(如 header + content + footer),得拼接:
return view('header', $data) . view('content', $data) . view('footer'); -
view()不支持第三个参数TRUE(即不自动输出),它默认只返回字符串;要输出就得靠echo或直接return
视图路径和命名空间无关,但文件位置有隐含约束
CI4 的 view() 默认从 app/Views/ 下查找,不识别 CI3 的 application/views/。迁移时要把整个 views 文件夹内容复制进 app/Views/,不能保留原路径。
- 路径分隔符统一用斜杠
/,不支持反斜杠;view('admin/user/list')会找app/Views/admin/user/list.php - 子目录层级无限制,但文件名不能含点号(如
user.list.php会被忽略,应改为user_list.php) - CI3 中通过
$this->load->view('errors/html/error_404')加载的错误页,CI4 已改用app/Views/errors/下的同名文件,且需按 HTTP 状态码命名(如404.php、500.php)
视图里不能直接访问 $this->xxx,$data 是唯一入口
CI3 视图中常出现 $this->load、$this->config 甚至 $this->some_model —— 这些在 CI4 视图中全部失效。CI4 视图是纯模板,只接收 view() 传入的 $data 数组(或对象)。
- 所有模型、服务、配置项都必须在控制器里准备好,再以键值形式塞进
$data - 例如:CI3 中视图里写
$this->user_model->get_name(),CI4 必须改成控制器里$data['user_name'] = $userModel->get_name();,视图里只用=$user_name?> - 试图在视图中调用
$this->db或$this->session会直接触发Fatal error: Uncaught Error: Using $this when not in object context
PHP 短标签和错误抑制符需清理
CI4 默认禁用短标签(=),且不再兼容 @ 错误抑制符在视图中的宽松使用——尤其在数组键不存在时,@$item->name 可能导致白屏而无提示。
- 确保服务器或
app/Config/Boot/development.php中开启short_open_tag = On,否则= $name ?>不解析 - 更安全的写法是用完整语法:
<?php echo $name ?? ''; ?>或<?php echo isset($item->name) ? $item->name : ''; ?> - CI4 开发模式下未定义变量会抛
Notice,别依赖@隐藏;应在控制器中补全$data结构,或在视图中用空合并操作符??
最易被忽略的是:CI4 的视图不继承任何类,也不参与 DI 容器,它就是个被 include 执行的 PHP 脚本。任何“想在视图里偷懒调服务”的念头,都会卡在 Call to undefined function 或 Undefined variable 上。


















