ThinkPHP 6.1 模板引擎未变更标签结构但收紧默认策略:{$name}禁空格换行;volist需显式声明key属性;if条件禁用未白名单函数;自定义标签改用include_once加载。

ThinkPHP 6.1 并未对模板引擎标签语法做结构性变更,foreach、volist、if、switch 等核心标签仍完全兼容 6.0,但有几处关键行为调整和默认策略收紧,直接影响模板渲染结果——尤其在升级后出现“变量不输出”“循环为空”“条件判断失效”时,大概率是这些点没处理。
标签解析更严格:空格/换行导致普通标签失效
6.1 对普通标签(如 {$name})的语法校验增强。若标签内存在开头空格、换行或末尾空格,将直接跳过解析,原样输出为纯文本。
- 错误写法:
{ $name }、{$name}→ 渲染结果就是字面字符串{ $name } - 正确写法必须紧贴:
{$name}、{$user.name}、{$data|default="—"} - 常见踩坑场景:IDE 自动格式化、复制粘贴代码、多行注释后紧跟标签(如
{!-- 注释 --}{$val.title}中换行未删净)
volist 标签默认不再自动展开关联数组 key
6.0 中 {volist name="list" id="item"} 若传入的是关联数组(非数字索引),id 变量会同时包含键名与值;6.1 起该行为被显式限制,id 仅承载值,键名需显式用 key 属性声明。
- 6.0 兼容写法(6.1 仍可运行但不推荐):
{volist name="map" id="v"}{$key}:{$v}{/volist}——$key是隐式注入的 - 6.1 推荐写法(明确且稳定):
{volist name="map" id="v" key="k"}{$k}:{$v}{/volist} - 若漏写
key且模板里用了$key,6.1 下该变量为空,不会报错,但逻辑断裂
if 条件表达式禁止直接调用未白名单函数
6.1 默认禁用模板中所有 PHP 函数调用(含 count()、empty()、isset() 等),除非在 view.php 配置中显式加入 tpl_function 白名单。
- 6.0 允许:
{if condition="count($list) > 0"}→ 直接执行 - 6.1 默认报错或静默失败(取决于 debug 模式),必须先配置:
'tpl_function' => ['count', 'empty', 'in_array', 'is_array'] - 更安全做法:在控制器层完成判断,传布尔变量进模板,如
$this->assign('has_data', !empty($list)),再用{if condition="$has_data"}
自定义标签库 require_once 被替换为 include_once
如果你在 app\common\taglib\ 下写了自定义标签类,6.1 的标签加载机制由 require_once 改为 include_once,意味着类文件中不能有重复定义、不能依赖 require_once 的“只加载一次”副作用。
- 典型问题:自定义标签类里又
require_once了同名工具类,6.1 下可能因加载顺序导致 Fatal error: Cannot declare class - 修复方式:统一用
use声明命名空间类,或确保被引入文件无重复 class 定义 - 验证方法:临时在标签类构造函数里加
echo 'loaded'; die;,看是否被多次触发
最易被忽略的是 tpl_function 白名单缺失和 volist 的 key 显式声明要求——这两个点不报错、不中断流程,但会让模板逻辑“看起来正常却结果不对”,排查时容易绕远路。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











