如何使用ThinkPHP模板include功能高效引入公共头部文件?
- 内容介绍
- 文章标签
- 相关推荐
本文共计783个文字,预计阅读时间需要4分钟。
在ThinkPHP框架中,要在视图文件中引入公共头部,最直接有效的方法是使用``标签。但需要注意以下事项,否则可能导致错误或显示空白:
ThinkPHP 6 的 {include file="xxx"} 路径怎么写才对
ThinkPHP 6 默认使用 ThinkTemplate 引擎,include 的 file 参数不支持相对路径(比如 ./header.html),也不推荐硬写完整路径。正确写法是基于 view_path 配置的相对路径:
- 公共头部放在
app/view/common/header.html,就在任意模板里写{include file="common/header"} - 如果在子目录如
app/view/admin/index.html中引用,仍用{include file="common/header"},不是../common/header - 后缀
.html可省略,但加上更明确;若模板后缀配置为php,则需对应写common/header.php - 路径中不能含
./或../,否则解析失败,返回空内容且无报错提示
为什么 {include} 里用不到父模板的变量
ThinkPHP 的 include 默认是“局部作用域”,子模板(如 header)无法直接访问父模板传入的数据,除非显式传递:
- 直接传参:
{include file="common/header" title="$title" user="$user"},子模板就能用$title - 全量继承当前作用域(慎用):加
assign属性{include file="common/header" assign="true"},但会导致变量污染,尤其在嵌套 include 时难调试 - 更稳妥的做法是统一用
View::assign()在控制器中预设公共变量(如site_name、nav_list),再在header.html中直接使用
include 进来的模板里能用 {block} 吗
不能。ThinkPHP 的 {block} / {extend} 是布局继承机制,只在顶层模板(被 fetch() 渲染的那个)中生效;include 是纯内容拼接,不触发继承解析:
立即学习“PHP免费学习笔记(深入)”;
- 如果在
common/header.html里写了{block name="title"}默认标题{/block},它不会被父模板中的{block name="title"}首页{/block}替换 - 想实现类似效果,得改用
{extend name="layout/master"}+{block}方式重构结构,把 header 放进 layout 模板里,而非靠 include - 混用
include和extend容易导致逻辑混乱,建议二选一:简单复用用 include,复杂布局统一用 extend
真正容易被忽略的是缓存行为:include 的文件修改后,若开启了模板缓存(默认开启),可能不会立即生效——需要清空 runtime/view/ 目录,或者临时关闭 template.cache 配置调试。
本文共计783个文字,预计阅读时间需要4分钟。
在ThinkPHP框架中,要在视图文件中引入公共头部,最直接有效的方法是使用``标签。但需要注意以下事项,否则可能导致错误或显示空白:
ThinkPHP 6 的 {include file="xxx"} 路径怎么写才对
ThinkPHP 6 默认使用 ThinkTemplate 引擎,include 的 file 参数不支持相对路径(比如 ./header.html),也不推荐硬写完整路径。正确写法是基于 view_path 配置的相对路径:
- 公共头部放在
app/view/common/header.html,就在任意模板里写{include file="common/header"} - 如果在子目录如
app/view/admin/index.html中引用,仍用{include file="common/header"},不是../common/header - 后缀
.html可省略,但加上更明确;若模板后缀配置为php,则需对应写common/header.php - 路径中不能含
./或../,否则解析失败,返回空内容且无报错提示
为什么 {include} 里用不到父模板的变量
ThinkPHP 的 include 默认是“局部作用域”,子模板(如 header)无法直接访问父模板传入的数据,除非显式传递:
- 直接传参:
{include file="common/header" title="$title" user="$user"},子模板就能用$title - 全量继承当前作用域(慎用):加
assign属性{include file="common/header" assign="true"},但会导致变量污染,尤其在嵌套 include 时难调试 - 更稳妥的做法是统一用
View::assign()在控制器中预设公共变量(如site_name、nav_list),再在header.html中直接使用
include 进来的模板里能用 {block} 吗
不能。ThinkPHP 的 {block} / {extend} 是布局继承机制,只在顶层模板(被 fetch() 渲染的那个)中生效;include 是纯内容拼接,不触发继承解析:
立即学习“PHP免费学习笔记(深入)”;
- 如果在
common/header.html里写了{block name="title"}默认标题{/block},它不会被父模板中的{block name="title"}首页{/block}替换 - 想实现类似效果,得改用
{extend name="layout/master"}+{block}方式重构结构,把 header 放进 layout 模板里,而非靠 include - 混用
include和extend容易导致逻辑混乱,建议二选一:简单复用用 include,复杂布局统一用 extend
真正容易被忽略的是缓存行为:include 的文件修改后,若开启了模板缓存(默认开启),可能不会立即生效——需要清空 runtime/view/ 目录,或者临时关闭 template.cache 配置调试。

