{include}最快但路径易错,{extend}+{block}更清晰可维护;ThinkPHP中{include}路径须为模板目录下相对路径,如“public/header”,不支持./或../,传参需显式声明,静态资源路径须用{__static__}前缀。

直接说结论:用 {include} 最快,但路径写错就白忙;想结构清晰、可维护性强,该上 {extend} + {block} 布局机制。
ThinkPHP 的 {include file="xxx"} 路径怎么写才不 404
90% 的引入失败,根源在路径不是「模板目录下的相对路径」。ThinkPHP 不认 ./、../,也不走 PHP 的 include_path。
-
{include file="public/header"}→ 对应view/public/header.html(推荐,简洁明确) -
{include file="/common/footer"}→ 从view/根目录开始找,即view/common/footer.html(绝对路径写法,适合跨子目录复用) -
{include file="admin@public/header"}→ 引入view/admin/public/header.html(仅当admin是有效模块名时生效) - 别写
{include file="./header"}或{include file="header.html"}—— 这两种都会去当前模板同级目录找,极易返回空白且无报错提示 - 后缀
.html可省略,但显式写出更防错;若你把模板后缀设为.php,就得写成common/header.php
传参给 {include} 的 header/footer 模板,为什么变量用不了
{include} 默认是局部作用域,父模板的 $title、$user 在被包含模板里直接访问不到——这不是 bug,是设计行为。
- 显式传参最安全:
{include file="public/header" title="首页" is_login=1 user_name=$user.name},子模板里就能用{$title}、{$user_name} - 不支持 PHP 数组字面量:
{include file="public/header" data="['title'=>'首页']"}会直接忽略,不报错也不解析 - 复杂数据建议提前 assign:
$this->assign('header_data', $data),再{include file="public/header" header_data=$header_data} - 慎用
assign="true":{include file="public/header" assign="true"}会全量继承父作用域,嵌套多层 include 时变量污染难排查
{include} 进来的 header 里写的 CSS/JS 全 404,怎么办
这不是 {include} 的问题,而是 HTML 资源路径相对于当前请求 URL 解析导致的。include 只做字符串拼接,不会自动修正 <link href="css/app.css"> 这类相对路径。
立即学习“PHP免费学习笔记(深入)”;
- 静态资源一律用
{__static__}动态前缀:<link href="{__static__}/css/app.css"> - 如果用了域名或 CDN,确保
__static__在配置中已正确设置(如'view_replace_str' => ['__static__' => '/static']) - 不要在
header.html里写<script src="./js/main.js">——./会相对于当前页面 URL,而不是模板位置 - 检查浏览器开发者工具 Network 面板,确认 404 请求的真实路径,反推
{__static__}是否漏配或路径层级错位
{include} 和 {extend} 能不能混着用
技术上可以,逻辑上容易混乱。二者定位不同:{include} 是内容复用,{extend} 是结构继承。
-
{block}在{include}进来的模板里完全无效 —— 它只在被fetch()渲染的顶层模板中解析 - 比如你在
common/header.html里写了{block name="title"}默认{/block},它不会被父模板的{block name="title"}首页{/block}替换 - 想实现区块替换效果,必须改用布局方式:
{extend name="layout/master"},然后在layout/master.html里{include file="common/header"},再用{__CONTENT__}插入主体 - 简单项目用
{include}快;中大型项目或需多级定制(如后台/前台不同头部),优先用{extend}统一管理结构
缓存是另一个隐形坑:改了 header.html 但页面没更新?先清空 runtime/view/ 下的模板缓存文件,或者临时关掉 template.cache 配置调试。



















