ci4视图继承要求extends()必须是文件首个php语句,禁止前置输出;section/endsection需成对且名称与父模板rendersection完全一致;仅支持单层继承,多层需用include();开发时应关闭缓存或清空writable/cache/views/。

视图继承时 extends() 报错“Undefined variable: view”
这是新手最常遇到的问题:在子视图里写 extends('layouts/main'),却提示变量未定义。根本原因不是语法错,而是没按 CI4 的约定把继承逻辑放在视图顶层——extends() 必须是文件中**第一个执行的 PHP 语句**,前面不能有任何输出(包括空格、换行、HTML 或 echo)。
- ✅ 正确写法:文件开头直接写
extends('layouts/main'),之后再写section('content') - ❌ 错误写法:顶部有
、空行、注释,或先写了 <code>标签 - ⚠️ 注意:
extends()不是函数调用,它只是告诉引擎“这个视图要继承谁”,必须由 CI4 的视图解析器在预处理阶段识别
如何让子视图正确填充父模板的 section?
父模板里用 renderSection('content'),子视图就得用 section('content') 包住内容,但很多人漏掉 endSection() 或写错名字。CI4 不报错,只是静默忽略——结果页面空白或只显示父模板骨架。
- 子视图必须成对使用:
section('xxx')和endSection(),名字要和父模板里renderSection('xxx')完全一致(区分大小写) - 父模板中未被子视图定义的
section,可以用renderSection('xxx', 'default content')提供 fallback - 不要在子视图里重复写
等全局结构——这些该由父模板统一控制
多层继承(layout → admin → dashboard)支持吗?
CI4 原生不支持链式继承,比如 A 继承 B、B 继承 C。你写 extends('admin/layout') 没问题,但 admin/layout.php 里再写 extends('layouts/base') 会失败——因为 CI4 的视图解析器只处理一层继承关系。
- workaround:把公共结构抽成独立视图,用
include()嵌入,例如在admin/layout.php里include_view('partials/html-head') - 别试图用
extends()套娃,CI4 解析器不会递归展开 - 如果真需要深度复用,建议用 HMVC 模块化拆分,而不是靠视图继承堆叠
为什么修改了父模板,子视图没更新?
CI4 默认开启视图缓存,且缓存键基于完整视图路径生成。当你改了 layouts/main.php,但子视图缓存没失效,就会继续渲染旧版本。
- 开发阶段最简单办法:在
app/Config/Views.php中设public $cache = false; - 或者手动清空
writable/cache/views/目录 - 注意:即使开了缓存,CI4 也会检查父模板文件修改时间,但前提是子视图缓存文件存在且未过期——有时需要删掉整个缓存目录才彻底生效











