ThinkPHP6.0模板继承是纯语法驱动、显式声明机制,首行必须正确书写{extend name="base"/},基础模板需定义{block name="xxx"},子模板用{block}完全替换同名区块内容,错误则原样输出不报错。

ThinkPHP6.0 的模板继承不需要全局开启配置,它不依赖 layout_on 这类开关,而是**纯语法驱动、显式声明**的机制。只要写对 {extend} 和 {block},就能生效;写错或漏掉关键点,就原样输出,不会报错也不会自动降级。
必须在子模板首行写 {extend}
子模板(比如 view/index/index.html)第一行必须是:
-
{extend name="base" /}或{extend name="public/base" /} - 不能缩进、不能空行、不能有 BOM、不能写在 PHP 注释或 HTML 注释后面
-
name值不带文件后缀,也不用写.html;路径是相对于view_path(默认是view/)的目录结构 - 错误示例:
{extends name="base"}(拼错为 extends)、{extend name="base.html"}(多加后缀)、缩进后的{extend name="base"}
基础模板里要定义同名 {block}
被继承的模板(如 view/base.html)需包含至少一个带 name 属性的 {block} 标签:
- 例如:
{block name="title"}<title>默认标题</title>{/block} - name 严格区分大小写,
content和Content是两个不同区块 - 区块内可写任意内容:HTML、变量(如
{$title})、{include}标签等 - 没有定义
{block name="xxx"},子模板里写了{block name="xxx"}也不会报错,但该区块内容会被丢弃
子模板中用 {block} 替换内容
子模板中写的 {block name="xxx"} 会**完全替换**基础模板中同名区块的全部内容(含默认文本和 HTML):
立即学习“PHP免费学习笔记(深入)”;
- 想保留父模板内容并追加?用
{__BLOCK__}占位:{block name="script"}{__BLOCK__}<script>doMore();</script>{/block} - 想清空该区域?直接写空区块:
{block name="sidebar"}{/block} - 变量在
{block}内可直接使用,这些变量来自控制器传入,作用域覆盖整个子模板
常见失效原因快速排查
如果页面上看到 {block name="title"} 原样文字,说明继承根本没触发:
- 查看浏览器源码:开头是不是子模板自己的 HTML?如果是,说明
{extend}没执行 - 检查子模板是否真正在第一行写了
{extend name="xxx"},且无任何前置字符 - 确认基础模板文件真实存在,路径和大小写与
name值完全一致(Linux 下Base.html ≠ base.html) - 开启调试模式后,搜索日志关键词
think\template\driver\File::read,看是否加载了布局文件



















