thinkphp的{include}标签默认继承父模板变量,但推荐显式传参以确保可靠性;传参须为扁平化字符串键值对,复杂数据应在控制器预处理后assign;子模板中不可直接调用$this等对象方法。

变量默认继承,但显式传参更可靠
ThinkPHP 的 {include} 标签默认会将父模板的全部变量作用域传递给被包含文件,所以 header.html 里通常能直接用 {$title}、{$user} 等。但这种隐式继承容易受模板编译顺序、缓存或嵌套层级影响,尤其在跨模块引入或使用了复杂赋值逻辑时,变量可能“看似存在实则为空”。推荐始终采用显式传参方式,语义清晰且可控性强。
正确传参写法:字符串键值对,不支持 PHP 数组语法
传参必须是扁平化的字符串键值对,不能写成数组形式。ThinkPHP 模板引擎不会解析 PHP 语法,只做字符串匹配替换。
- 单个变量:
{include file="public/header" title="首页"}→ header.html 中用{$title} - 多个变量:
{include file="public/header" title="首页" is_login=1 user_name=$user.name} - 错误写法:
{include file="public/header" data="['title'=>'首页']"}→ 直接忽略,不报错但也不生效
复杂数据建议控制器预处理后传入
如果要传数组、对象或需动态计算的数据(如菜单列表、用户权限树),不要在 {include} 标签里拼接复杂表达式。应在控制器中统一组装好,再 assign 给模板变量,最后通过 {include} 传过去。
- 控制器中:
$this->assign('header_data', ['title' => '首页', 'menu' => $menuList]); - 模板中:
{include file="public/header" header_data=$header_data} - header.html 中:
{volist name="header_data.menu" id="item"}{$item.name}{/volist}
避免 this 或对象方法在 include 中直接调用
被包含模板中无法直接使用 {$this->method()} 或 {$app->config()} 这类写法。{include} 不会继承对象上下文,$this 在子模板中不可用。所有需要的对象能力,必须提前在控制器中调用并 assign 成普通变量。
- 正确:控制器里
$this->assign('site_name', config('app.name'));,模板中{include file="public/header" site_name=$site_name} - 错误:在 header.html 里写
{$this->config('app.name')}→ 解析失败或输出空
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











