thinkphp 6+ 已移除 fetch() 模板继承语法,弃用 extend/block/parent,改用 {include} 和变量传递;tp8 默认不加载 think-template,需手动安装并配置 'type' => 'think';view_assign() 与 $this->assign() 行为一致但覆盖逻辑需注意;strip_space 开启时 {if} 缩进失效,建议关闭该配置并构建时压缩 html。

ThinkPHP 6+ 已移除 fetch() 的模板继承语法支持
ThinkPHP 6.0 起彻底弃用了基于 extend、block、parent 的原生模板继承机制,改用更轻量的 {include} 和变量传递。如果你在升级后发现子模板里写 {extend name="layout"} 报错或直接输出原样,不是配置问题,是语法已被删除。
常见错误现象:Parse error: syntax error, unexpected 'extend' (T_STRING) 或页面空白但日志无报错(因解析器跳过未知标签)。
- 必须将旧模板中所有
{extend name="xxx"}改为手动引入布局 + 显式传参:{include file="layout" title="$title" content="$content"} -
{block name="xxx"}{/block}全部替换为普通变量,比如把{block name="content"}...{/block}改成{$content|default='默认内容'} - 原
{parent}调用已不可用,需在布局模板里预留占位变量,由子模板通过assign()提前注入
ThinkPHP 8 默认不加载 think-template 扩展包
TP8 默认使用原生 PHP 模板(.php 后缀),不再内置 ThinkTemplate 引擎。如果你还依赖 {volist}、{foreach} 这类标签,会直接报 Call to undefined function think\template\TagLib::parse()。
使用场景:老项目迁移、团队习惯 ThinkTemplate 语法、需要兼容历史模板文件。
- 需手动安装:
composer require topthink/think-template - 安装后要在
config/template.php中显式启用:'type' => 'Think',否则即使装了也不生效 - 注意兼容性:TP8.0+ 的
Think驱动已不支持{literal}和部分自定义标签闭合写法,如{mytag /}必须写成{mytag}+{/mytag}
view_assign() 和 $this->assign() 在模板中行为不一致
TP6+ 中 view_assign() 是全局函数,用于控制器外赋值;而 $this->assign() 是控制器方法内调用。两者都写进模板变量作用域,但优先级和覆盖逻辑容易混淆。
容易踩的坑:在中间件或公共函数里用 view_assign('user', $data),结果控制器又用 $this->assign('user', []),后者会覆盖前者 —— 不是因为“谁后执行”,而是因为 $this->assign() 底层调用的是同一个 View 实例的 data 属性,且默认不合并数组。
- 若需叠加数据,控制器里应显式合并:
$this->assign(array_merge(view_get_assign(), ['user' => $newUser])) -
view_assign()适合初始化全局变量(如站点名、CDN 域名),但不要用来传业务数据 - 模板中访问变量一律用
{$var},不存在“作用域隔离”,所有assign进来的变量都在同一层级
开启 strip_space 后 {if} 标签缩进失效导致 HTML 错位
TP 模板引擎的 strip_space 配置(默认开启)会删除模板中所有换行与多余空格,但它对 ThinkTemplate 标签块的处理是“按行删”,不是按语法树删 —— 导致 {if} 开头没空格、结尾有换行时,前后 HTML 标签被挤到一行,破坏语义结构。
典型表现:表单按钮突然跑到输入框右侧、<ul></ul> 里 <li> 没换行变成横向排列、CSS flex 布局错乱。
- 临时解决:在
config/template.php中设'strip_space' => false,但会增大输出体积 - 推荐做法:关闭
strip_space,改用构建时压缩 HTML(如通过 Webpack 或 Nginx 的ngx_http_gzip_module) - 如果坚持用
strip_space,所有{if}、{/if}必须顶格写,且前后 HTML 行末不能有空格,否则压缩逻辑会误判边界
模板语法适配不是改几个标签就能完事的事,关键是理解 TP 每次大版本对“模板即 PHP”的定位变化 —— 它越来越倾向让你写真 PHP,而不是维护一套私有 DSL。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










