根本原因是tp6.1.2模板引擎要求default过滤器必须带等号和参数,{$var|default}缺=导致解析器卡住,将后续}误判为“unexpected '}'”。

ThinkPHP 6.1.2 中模板使用 {$var|default} 却报 Parse error: syntax error,根本原因不是过滤器本身写错,而是 default 后面**缺了等号和默认值**——即你写了 {$var|default},但 TP6.1.2 的模板引擎要求 default 过滤器**必须带参数**,语法为 {$var|default='xxx'} 或 {$var|default=$otherVar}。
为什么缺等号会触发 Parse Error?
TP6 的模板编译器在解析 |default} 时,把 default 当作一个“过滤器名”,接着期望看到 =(因为所有带参数的过滤器都强制要求等号语法)。一旦没见到 =,解析器就卡住,后续字符(比如 })就被当成“意外出现的 token”,于是报类似:
Parse error: syntax error, unexpected '}'
或
Parse error: syntax error, unexpected end of file
注意:错误行号往往指向 } 所在行,但真正问题在前面——|default 后面没接 =。
default 过滤器的合法写法(TP6.1.2 要求)
-
{$name|default='匿名用户'}✅ 字符串默认值,用单引号或双引号包裹 -
{$age|default=0}✅ 数字默认值,不加引号 -
{$user.email|default=$guestEmail}✅ 变量默认值,不加引号 -
{$status|default='pending'}✅ 带点号的变量也支持,只要右边是合法表达式
常见误写及修正
- ❌
{$title|default}→ 缺等号和值,必报错 - ❌
{$title|default ''}→ 空格代替等号,不被识别,仍报错 - ❌
{$title|default("N/A")}→ TP6 模板不支持函数调用语法,括号写法无效 - ✅
{$title|default='N/A'}→ 正确,带等号+引号字符串 - ✅
{$title|default=''}→ 空字符串也合法,但需保留等号
其他可能干扰判断的情况
如果确认写了等号仍报错,再检查以下几点:
- 引号是否成对:模板中混用中文引号“”、漏闭合单引号,会导致解析提前中断
- 变量名是否含非法字符:如
{$data.0.name}在 TP6 模板中是允许的,但{$data->name}不支持(箭头语法被禁用) - 是否启用了模板缓存:改完后未清
runtime/view/,旧缓存仍在执行错误语法 - 是否误用 PHP 原生语法:TP6 已移除
{php}...{/php}和{:...}执行能力,这类写法也会引发解析异常
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











