ThinkPHP 3.2.4 迁移至 5.1 需重构模板引擎:变量输出由自动转义改为默认不转义({$var}→{&$var}),{if}/{foreach}语法更严格,布局改用{extend}+{block}机制,L()、U()等函数被{:url()}、{:get_root()}等替代。

ThinkPHP 3.2.4 迁移到 5.1,模板语法不是“改几个标签”就能跑通的事——它背后是整个视图引擎的重构。5.1 彻底弃用 3.2 的原生 PHP 模板解析机制,转而采用更规范、更可控的 think-template 引擎(虽仍支持 .html 后缀,但解析逻辑已完全不同)。直接复制 3.2 的 tpl 文件到 5.1 的 view 目录下,大概率会报错或渲染为空。迁移核心是三件事:标签语义对齐、变量输出规则重写、布局与继承机制切换。
变量与表达式输出:从 {$var} 到 {&$var} 和 {php}
3.2 中 {$name} 默认自动 HTML 转义,{:htmlspecialchars($name)} 手动输出原始内容;5.1 反过来:{$name} 是**不转义**的,安全输出需显式加 {|htmlspecialchars} 或用 {&$name}(等价于 {:$name},即自动转义)。这点极易翻车,尤其在用户输入内容直出场景。
- 3.2 写法:
{$title} {:htmlspecialchars($content)} - 5.1 对应写法:
{&$title} {$content|htmlspecialchars}或{:$title} {$content|htmlspecialchars} - PHP 表达式不再支持
{:...}通用前缀,必须用{php}...{/php}包裹,且内部不能写 echo/print;如需赋值,用{php}$a = 'test';{/php}
条件与循环:{if} / {foreach} 结构升级
5.1 的 {if} 支持更接近 PHP 原生语法的比较操作(如 eq, neq, gt 等别名仍可用,但推荐直接写 ==, !=, >),且必须严格闭合。3.2 允许 {if $a}{/if} 单层简写,5.1 不再识别——所有分支都必须显式写出 {else} 或 {elseif}。
- 3.2 常见写法:
{if $status eq 1}启用{else}禁用{/if} - 5.1 推荐写法:
{if $status == 1}启用{else}禁用{/if} -
{foreach}中的 key 和 item 变量名必须声明,不能省略;{foreach $list as $vo}→{foreach name="list" item="vo"};索引访问改用{$key}和{$vo.id},不再支持{$vo['id']}
模板继承与布局:从 layout 模板到 extend + block
3.2 的 <extend file="Public/layout.html"></extend> 在 5.1 中失效。5.1 使用标准的 {extend name="public/layout"} + {block name="content"}...{/block} 机制,且父模板中 {block} 必须有名称,子模板用同名 {block} 覆盖。公共 CSS/JS 不再靠 {include file="Public/head"} 硬引入,而是统一收口到 layout 的 {block name="css"}{/block} 和 {block name="script"}{/block} 中,由子页按需注入。
立即学习“PHP免费学习笔记(深入)”;
- 父模板(layout.html)需包含:
{block name="content"}默认内容{/block} - 子模板开头写:
{extend name="public/layout"}{block name="content"}这里是页面主体{/block} - 注意路径:5.1 中
name="public/layout"对应的是view/public/layout.html,不是Public/目录(大小写敏感,且无大写 Public 目录约定)
函数与系统变量:L()、U()、__ROOT__ 等全部失效
3.2 的模板函数在 5.1 中被移除或替换:L('LANG_KEY') 不再可用,多语言需在控制器 assign 时传入翻译后的字符串;U('Index/index') 消失,URL 生成统一用 {:url('index/index')};__ROOT__ 变成 {:get_root()} 或更推荐用 {:url('')} 配合静态资源路径配置;__PUBLIC__ 应改为 {:get_public_path()} 或直接使用相对路径(如 /static/css/app.css)。
- 控制器中提前处理语言:
$this->assign('welcome', lang('WELCOME_TIP'));,模板中写{$welcome} - 链接生成:
{:url('user/profile', ['id' => $id])}替代U('User/profile', ['id'=>$id]) - 图片/JS/CSS 引用建议用
/static/统一前缀,避免依赖框架函数



















