thinkphp 默认使用 think-template 模板引擎,启用原生 php 模板需配置 'type' => 'php'(tp6/8)或 'tmpl_engine_type' => 'php'(tp5.1),模板内直接写 php 代码,用 $var 取值、include 复用、手动过滤输出。

ThinkPHP 默认使用 think-template(即 ThinkTemplate)作为内置模板引擎,它不是原生 PHP 模板,而是基于 XML 标签解析的编译型引擎。所谓“原生模板引擎”,在 ThinkPHP 语境中特指将模板文件直接当作 PHP 脚本执行——即关闭标签解析、启用 'TMPL_ENGINE_TYPE' => 'PHP' 的配置方式。这种方式性能更高、调试更直观,但需放弃所有内置模板标签(如 {if}、{volist}),完全依赖 PHP 原生语法。
明确启用原生 PHP 模板模式
必须在配置中显式指定,否则仍走 think-template 解析流程:
- ThinkPHP 6/8 中,在
config/view.php中设置:'type' => 'php', - 旧版本(如 TP5.1)则在
config/template.php或全局配置中写:'template' => ['engine_type' => 'php']或'TMPL_ENGINE_TYPE' => 'PHP' - 启用后,模板文件后缀仍为
.html或.php,但内容必须是合法 PHP 代码,例如:<?php echo $title ?? '默认标题'; ?>
变量传递与作用域控制
原生模式下,assign() 依然可用,但最终注入的是 PHP 变量作用域,非标签上下文:
- 控制器中可链式调用:
return $this->assign('user', $user)->fetch(); - 也可直接在
fetch()中传数组:return $this->fetch('index', ['title' => '首页', 'items' => $list]); - 模板内直接使用
$title、$items,无需{$title}或{$items[0]['name']}等标签写法 - 注意:未定义变量会触发 Notice,建议用空合并操作符:
<?php echo $desc ?? '暂无描述'; ?>
复用与布局:用 PHP 方式替代 {include} 和 {extend}
原生模式不识别 {include} 或 {extend} 标签,需改用 PHP 的 include / require 机制:
- 头部复用:
<?php include dirname(__FILE__) . '/public/header.php'; ?> - 更推荐使用视图路径常量(TP6+ 支持):
<?php include app()->getAppPath() . 'view/public/header.php'; ?> - 布局嵌套可通过手动输出缓冲实现:
在 layout.php 中:<?php ob_start(); ?>{__CONTENT__}<?php $content = ob_get_clean(); echo $content; ?>;子模板先ob_start(),再includelayout
安全与过滤:主动调用函数,不依赖 | 过滤器
原生模板中无法使用 {$data|htmlspecialchars|date='Y-m-d'} 这类管道语法,所有过滤必须显式调用:
- 输出前手动处理:
<?php echo htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); ?> - 日期格式化:
<?php echo date('Y-m-d H:i', $post['create_time'] ?? time()); ?> - 可封装简易助手函数(放在
app/common.php):function e($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); }
模板中:<?php echo e($title); ?>
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











