thinkphp 5.0 中 {include file="public/header" /} 找不到文件,是因为默认按当前模板目录(如 admin/index/)查找,而非 view/ 根目录;正确写法是 {include file="public@public/header" /} 或确保 view_path 配置包含 public/ 目录。

直接用 {include file="public/header" /} 就能引入,但实际项目里常因路径、模块、变量作用域或缓存导致失败——不是找不到文件,就是引入后变量不生效、样式错乱、甚至报错。
为什么 {include file="public/header" /} 有时找不到文件
ThinkPHP 5.0 的 {include} 标签默认按「当前模板目录」为基准查找,不是按 application/view/ 根目录。比如你在 application/view/admin/index/index.html 里写 {include file="public/header" /},它实际找的是 application/view/admin/index/public/header.html,而不是你预期的 application/view/public/header.html。
- 正确写法是加前缀:
{include file="public@public/header" /}(public@表示使用public模块的视图目录) - 若
public是公共模板目录且已配置在view配置项中(如'view_path' => APP_PATH.'view/'),也可用绝对路径写法:{include file="public/header" /},但前提是你的view_path确实指向了包含public/子目录的根路径 - 常见错误:把
header.html放在application/view/common/下却写成{include file="common/header" /}—— ThinkPHP 5.0 默认不识别common这个伪模块名,会直接拼路径失败
{extend} 和 {block} 比 {include} 更适合做布局复用
单纯引入一个 header 可用 {include},但如果你还希望子模板控制 title、SEO、JS 加载顺序等,{extend} 才是标准解法。它本质是模板继承,不是文件拼接。
- 先建
application/view/public/layout.html,里面定义{block name="header"}{/block}、{block name="content"}{/block} - 子模板开头写:
{extend name="public/layout" /},然后用{block name="content"}...{/block}填充主体 - 注意:
{extend}必须是模板第一行,前面不能有任何空格或输出,否则报错Cannot modify header information -
{block}中可嵌套{include},比如{block name="header"}{include file="public/header" /}{/block},这样既复用又保留控制权
引入时传参和变量作用域问题
用 {include} 引入的模板,默认共享父模板的变量;但若父模板里有同名变量被覆盖,子模板看到的是最后赋值的那个——这点容易被忽略。
- 安全做法是显式传参:
{include file="public/header" title="$title" user="$user" /},被引入的header.html就只能访问$title和$user,不会意外读到父模板其他变量 - 如果传的是数组,记得用点号展开:
{include file="public/header" data="$data" /},然后在header.html里用{$data.name}访问 - 不要在
header.html里写<?php echo $title; ?>—— ThinkPHP 模板引擎不解析原生 PHP,只认{$title}
真正卡住人的往往不是语法对不对,而是 view_path 配置是否包含公共目录、{extend} 是否顶格写、以及传参时忘了加引号导致解析失败——这些地方没报错,但页面就莫名空白或错位。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











