ThinkPHP5模板报Undefined variable的根本原因是控制器未显式传参或传参结构不匹配,必须通过$this->assign()或return view()传入变量,且键名大小写需严格一致,模板中应使用|default修饰符而非isset()。

ThinkPHP5 模板里报 Undefined variable,基本不是 PHP 层面的变量未声明问题,而是模板变量没被控制器显式传入、或传入结构与模板写法不匹配。关 E_NOTICE 或加 isset() 在模板里无效,还可能掩盖真实漏传逻辑。
控制器必须显式 assign 或 return view() 传参
TP5 的模板引擎不继承任何 PHP 全局变量,$this->assign('user', $data) 和 return view('index', ['user' => $data]) 是唯二合法入口。漏掉这一步,模板里所有 {$user} 都会触发 Undefined variable: user —— 这是模板引擎在访问空数组键时抛出的 Notice,不是语法错误。
- 检查控制器方法末尾是否写了
return view()或调用了$this->assign(),光写view('index')不带参数等于没传 - 确认传入数组的键名和模板中变量名大小写完全一致:
['UserInfo' => $u]→ 模板只能用{$UserInfo},{$userinfo}是空 - 嵌套对象或数组字段必须用点号语法:
{$user.name}合法,{$user->name}在 TP5 模板里不识别,会报未定义
模板里别用 isset() 判断变量是否存在
TP5 模板编译器不支持原生 PHP 函数调用,{% if isset($user.avatar) %} 会被当作文本输出,甚至直接报错;{% if $user.avatar %} 在变量根本不存在时就会触发 Undefined variable。
- 兜底一律用
|default修饰符:{$user.avatar|default='avatar.png'},它能捕获“变量未传入”“键不存在”“值为 null/''/false/0”四种情况 - 别写成
{$user.avatar|default('avatar.png')}—— TP5 只认竖线|写法,括号会被原样输出为字符串 - 需要分支逻辑时,改用
{% if $user.avatar|empty %},它底层做了存在性 + 空值双重检查,不会触发 Notice
调试要查真实传入数据,不是猜模板写法
报错说 Undefined variable: user,但问题往往不在模板那行,而在控制器漏传、拼错键名、或数据源为空导致整个 $user 没生成。
立即学习“PHP免费学习笔记(深入)”;
- 在模板开头加一行
{:dump($this->getTemplateVars())},看实际传了哪些变量、结构是不是你预期的(比如$user是 null 还是空数组) - 确认
topthink/think-view已安装:composer require topthink/think-view,否则view()可能静默失败 - 检查视图路径是否匹配默认规则:如
IndexController@index默认找app/view/index/index.html,路径错会导致模板加载失败,变量自然没传过去
最常被忽略的是:TP5 模板变量作用域是单向封闭的,控制器不传,模板就真没有——它不像原生 PHP 那样能靠作用域链往上找。别在模板里写 {php}...{/php} 或尝试调用函数,这些在 TP5 里已被移除,只会让问题更难定位。



















