应显式通过assign或view参数传递变量,模板不继承全局变量;嵌套字段用{$user.name|default=''}兜底,禁用isset判断;调试用{:dump($this->getTemplateVars())}定位真实传入数据。

ThinkPHP模板里变量“看着写了却用不了”,多数不是漏传,而是作用域理解偏差或写法越界。核心问题在于:模板变量只认控制器 显式 assign 进来的数据,不继承 PHP 全局变量、不自动解析未声明结构、也不支持函数内直接调用外部变量。
确保变量已正确传入模板
控制器中必须用 return view('template', ['key' => $value]) 或 $this->assign('key', $value) 显式传递。光写 view('index') 不带参数,模板里任何 {$key} 都会报未定义——这不是警告,是 PHP 底层对空数组键/未声明对象属性的直接提示。
- 检查控制器是否漏掉
assign或传参数组键名拼写错误(如传'user_info'却在模板写{$user}) - 大小写必须完全一致:
['UserName' => 'Tom']→ 模板只能用{$UserName},{$username}是空 - 对象或数组嵌套需按模板语法访问:
{$user.name}合法,{$user->name}在 TP6 中不识别
用 default 修饰符兜底未定义字段
即使变量传进来了,$user 可能有,但 $user['profile'] 或 $user->avatar 可能根本不存在。这时不能靠 {% if isset($user.avatar) %},因为模板引擎在编译阶段就报 Undefined variable: user。
- 输出场景统一用
{$user.avatar|default='default.png'}——default能捕获“完全未定义”和null、''、false、0 - 别写成
{$user.avatar|default('default.png')},TP5/6 只认竖线|写法,括号会被当字符串原样输出 - 需要判断再分支时,改用
{% if $user.avatar|empty %},它底层做了存在性检查,不会触发警告
避开模板不支持的 PHP 行为
TP6 的 think-view 已移除所有原生 PHP 嵌入能力,误以为能用的写法实际无效。
-
{php}echo 'hello';{/php}直接报错或忽略 -
{:date('Y-m-d')}不执行函数,原样输出字符串 -
{% if $data ?? false %}是 PHP 空合并操作符,模板引擎不解析,只会输出字面量$data ?? false - 自定义函数或全局常量不能直接在模板调用,必须通过
assign传入或注册为模板函数
调试要定位到真正源头
报错提示“未定义变量”,但问题往往不在模板行,而在控制器逻辑或配置环节。
- 开发时加一行
{:dump($this->getTemplateVars())},看实际传了哪些变量、结构是否符合预期 - 确认
topthink/think-view扩展已安装:composer require topthink/think-view,否则view()静默失败 - 检查视图路径是否匹配默认规则:如
IndexController@index对应app/view/index/index.html,放错位置等于没传 - 清空
runtime/view/缓存目录,避免旧缓存干扰新变量结构
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











