ThinkPHP 6+ 已弃用 view_cache 配置,需通过 config/view.php 的 cache_path 和 compile_type 控制编译缓存;assign 大量嵌套数据应预展平;TP7 中 {volist} 必须显式声明 key 属性,自定义模板函数须通过 TagLib 子类注册。
ThinkPHP 6.x 视图编译缓存默认开启,但
配置不生效?
不是配置没起作用,而是 ThinkPHP 6+ 已弃用
全局开关——它被拆解到模板引擎驱动层。直接改
里的
和
才真正影响编译行为。
常见错误现象:
命令清不掉缓存、修改模板后页面不更新、
模式下仍生成
编译文件。
设为
(默认)才走文件缓存;设为
则跳过写磁盘,但调试困难、无法复现线上问题
必须是可写绝对路径,相对路径(如
)在 CLI 环境下可能解析失败
CLI 下执行
实际清理的是
对应目录,不是
使用
传大量数据导致视图渲染变慢?
不是
本身慢,而是 PHP 数组在模板中反复访问时,未启用变量预提取会触发多次
或数组键查找。尤其当传入嵌套深度 >3 的数组或对象时,Twig 引擎(TP6 默认)的
代理开销明显。
性能影响:1000 条列表 + 每条含 5 层嵌套数组,渲染耗时可能从 80ms 升至 220ms。
立即学习
“
PHP免费学习笔记(深入)
”;
避免在模板里写
这类长链访问,提前在控制器 flatten 数据:
对只读数据,用
替代多次
:一次
比十次
少约 12% 开销
若用
手动渲染,传参优先用数组而非链式
,减少视图实例状态维护成本
升级到 ThinkPHP 7 后
标签报错
TP7 模板引擎(基于 ThinkTemplate v3)重写了标签编译逻辑:
默认不再自动暴露
变量,必须显式声明
才可用。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
错误现象:TP6 正常的
,在 TP7 中
解析为空或报 Notice。
正确写法:
兼容旧模板的临时方案:在
中设置
,但该选项仅限调试,上线前建议统一显式声明
注意
属性在 TP7 中已改为
字符串值判断,不能写
—— 会被当成布尔真值
自定义模板函数在
v3 下失效?
TP7 使用的
v3 不再支持全局函数注册方式
,所有扩展必须通过驱动类注入,否则编译阶段就跳过解析。
典型场景:你写了
,但页面输出原样字符串,不执行函数。
必须在
中绑定自定义模板驱动,继承
并重写
方法
函数注册入口已移至
子类,例如新建
,并在其中用
模板中调用仍为
,但底层不再走 PHP
,而是编译成内联表达式,所以参数不能含复杂语法(如
会编译失败)
最易被忽略的是模板缓存路径权限和驱动绑定时机——TP7 的编译器在第一次请求时就固化解析规则,改了 TagLib 类也不生效,必须清空
再试。
view_cacheview_cacheconfig/view.phpcache_pathcompile_typeview:cleardebug.phpcompile_type'file''eval'cache_path'runtime/view'php think view:clearconfig('view.cache_path')runtime/cacheassign()assign()__getArrayAccess{$list.0.user.profile.avatar.url}$list = array_map(fn($i) => ['avatar_url' => $i['user']['profile']['avatar']['url']], $list)extract()assign()$this->assign([...])$this->assign('a', ...)->assign('b', ...)View::fetch()assign{volist}Undefined variable: key{volist}$keykey="k"{volist name="list" id="item"}{$key} {$item.name}{/volist}{$key}{volist name="list" id="item" key="k"}{$k} {$item.name}{/volist}config/template.php'default_key_name' => 'key'emptyempty=""empty="无数据"think-templatethink-templateTemplate::extend('func', ...){:date_format($time, 'Y-m-d')}app/provider.phpthink\template\driver\FileparseTag()think\template\TagLibapp/taglib/My.php$this->addFunction('date_format', ...){:date_format(...)}call_user_func{:date_format($a ?: $b, 'Y')}runtime/template