thinkphp模板继承必须显式声明{extend}且规范使用{block},否则{block}原样输出;子模板首行须为{extend name="base"}(无缩进、无空行、无bom、不带后缀),布局中需定义同名{block},替换为完全覆盖,追加需用{__block__}。

ThinkPHP模板继承不是自动生效的,必须手动声明继承关系并规范使用{block}标签,否则子模板会原样输出,{block}内容不渲染。
基础写法:两步缺一不可
子模板第一行必须是{extend name="base"}(注意:不能缩进、不能空行、不能有BOM、不能写在PHP注释后),且name值不带文件后缀(如base对应view/base.html);布局模板中需定义同名{block name="xxx"}{/block}区块,name严格区分大小写。
-
{extend name="public/layout"}→ 加载view/public/layout.html -
{extend name="admin/base"}→ 加载view/admin/base.html - 路径不支持
./或../写法,必须是相对于view_path的目录结构
block 标签怎么用才有效
{block}是“完全替换”,不是“追加”或“占位”。子模板中写了同名{block},就会把布局里对应区块的全部内容(含HTML和默认文本)替换成你写的部分。
- 想保留布局默认内容并额外添加?用
{__BLOCK__}:{block name="script"}{__BLOCK__}<script>initMore();</script>{/block} - 空
{block name="content"}{/block}= 清空该区域,不是“跳过” - 变量在
{block}内部可直接使用(继承自子模板上下文),但{block}外部区域无法访问子模板变量
常见失效原因排查
页面上直接看到{block name="title"}...原样文字,说明继承根本没触发。
- 检查子模板首行是否为
{extend ...},有没有拼成{extends}或写在第二行 - 查看浏览器源码:如果开头就是子模板内容(没有布局的
或公共header),说明extend未执行 - 确认布局文件真实存在,路径大小写与实际文件一致(Linux下
Layout.html≠layout.html) - 调试时搜日志关键词
think\template\driver\File::read,看是否加载了布局文件
不推荐多层继承
ThinkPHP不支持A继承B、B再继承C的链式继承。若child.html继承middle.html,而middle.html又继承base.html,child.html无法直接覆盖base.html中的block——它只能覆盖middle.html中显式声明并透传的部分。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











