ThinkPHP 的模板引擎设计得非常灵活,它允许开发者使用多种风格的模板语法,从传统的类似 PHP 语法到更现代、更简洁的标签语法,这种灵活性是 ThinkPHP 模板系统的一大特点。

ThinkPHP 的模板风格可以概括为:以标签语法为核心,兼容原生 PHP,并支持多种引擎扩展。
下面我们从几个方面来详细解析:
核心风格:标签语法
这是 ThinkPHP 模板最推荐、也是最主流的风格,它通过 {标签名 属性="值"} 的形式来执行逻辑和输出数据,使得模板文件和业务逻辑(PHP 代码)分离得非常清晰。
a) 变量输出
这是最基本的功能,ThinkPHP 会自动将控制器中分配的变量传递给模板。

控制器中分配变量:
namespace app\controller;
use think\facade\View;
class Index
{
public function hello()
{
$name = 'ThinkPHP';
$age = 10;
View::assign('name', $name);
View::assign('age', $age);
// 或者使用批量赋值
$data = [
'user' => ['id' => 1, 'nickname' => 'Tom'],
'articles' => [1 => '文章一', 2 => '文章二']
];
View::assign($data);
return View::fetch('hello');
}
}
模板文件 hello.html 中输出:
<p>普通变量输出: {$name}</p>
<p>变量属性输出: {$user.nickname}</p>
<p>数组索引输出: {$articles[1]}</p>
<p>使用默认值: {$age|default=0}</p> <!-- $age 未定义,则输出 0 -->
b) 使用函数/修饰符
可以对变量进行简单的处理,如首字母大写、截取字符串等。
<p>原始名字: {$name}</p>
<p>首字母大写: {$name|ucfirst}</p>
<p>截取前5个字符: {$name|substr=0,5}</p>
<p>多个函数组合: {$name|md5|substr=0,8}</p>
c) 条件判断
使用 if 标签进行逻辑判断。

{if condition="$age eq 10"}
<p>年龄正好是10岁。</p>
{elseif condition="$age gt 10"}
<p>年龄大于10岁。</p>
{else /}
<p>年龄小于10岁。</p>
{/if}
d) 循环输出
使用 volist 和 foreach 标签遍历数组。
volist 标签(功能更强大,专为数组设计):
<!-- 遍历 user 数组 -->
<ul>
{volist name="user" id="u"}
<li>ID: {$u.id}, 昵称: {$u.nickname}</li>
{/volist}
</ul>
<!-- 遍历 articles 数组,并指定 key -->
<ul>
{volist name="articles" id="art" key="k"}
<li>索引 [{$k}]: {$art}</li>
{/volist}
</ul>
foreach 标签(语法更接近 PHP):
<ul>
{foreach $user as $u}
<li>昵称: {$u.nickname}</li>
{/foreach}
</ul>
e) 模板包含与继承
这是 ThinkPHP 模板实现页面布局复用的核心机制。
-
模板继承 (
extend):定义一个基础布局模板,子模板可以继承它并覆盖指定区域。layout/base.html(基础模板):<!DOCTYPE html> <html> <head> <title>{block name="title"}默认标题{/block}</title> </head> <body> <header>网站头部</header> <div class="main"> {block name="content"}这里是主内容区域{/block} </div> <footer>网站底部</footer> </body> </html>index/index.html(子模板):{extend name="layout/base" /} {block name="title"}首页 - 我的网站{/block} {block name="content"} <h1>欢迎来到首页!</h1> <p>这里是首页的具体内容。</p> {/block} -
模板包含 (
include):在当前模板中插入另一个模板文件,用于复用公共模块,如头部、底部、侧边栏等。{include file="public/header" /} <h1>页面内容</h1> {include file="public/footer" /}
兼容风格:原生 PHP 语法
ThinkPHP 的模板引擎默认是兼容原生 PHP 语法的,这意味着你可以在模板文件中直接写 PHP 代码,这在某些复杂逻辑下非常有用,但不推荐,因为它破坏了模板与逻辑分离的原则。
<p>使用原生 PHP 输出变量:</p>
<?php echo $name; ?>
<p>使用原生 PHP 循环:</p>
<ul>
<?php foreach($articles as $key => $value): ?>
<li>Key: <?php echo $key; ?>, Value: <?php echo $value; ?></li>
<?php endforeach; ?>
</ul>
其他模板引擎风格
ThinkPHP 的模板系统是可插拔的,除了默认的 Think 模板引擎,你还可以轻松切换到其他流行的模板引擎,如 Twig。
a) Twig 风格
如果你熟悉 Symfony 或其他现代 PHP 框架,可能会更喜欢 Twig 的简洁和安全。
安装 Twig:
composer requiretwig/twig
配置模板引擎:
在 config/tpl.php 或 config/view.php 中(版本不同配置文件可能略有差异):
return [
'type' => 'Twig', // 指定模板引擎类型
// Twig 引擎的其他配置...
];
在模板中使用 Twig 语法:
{# 注释 #}
<p>变量输出: {{ name }}</p>
{# 条件判断 #}
{% if age > 10 %}
<p>年龄大于10岁。</p>
{% else %}
<p>年龄小于等于10岁。</p>
{% endif %}
{# 循环 #}
<ul>
{% for user in users %}
<li>{{ user.nickname }}</li>
{% endfor %}
</ul>
{# 模板继承 #}
{% extends "layout/base.html" %}
{% block content %}
<h1>首页内容</h1>
{% endblock %}
模板配置与优化
ThinkPHP 提供了丰富的配置选项来控制模板的行为,通常在 config/tpl.php 或 config/view.php 中配置。
// config/view.php
return [
// 模板路径
'view_path' => app()->getAppPath() . 'view/',
// 模板后缀
'view_suffix' => 'html',
// 模板引擎
'type' => 'Think',
// 模板开启布局
'layout_on' => true,
// 布局模板文件
'layout_name' => 'layout',
// 视图输出字符串内容替换
'tpl_replace_string' => [
'__STATIC__' => '/static',
'__CSS__' => '/static/css',
'__JS__' => '/static/js',
],
// 关闭模板缓存
'tpl_cache' => false,
// 开启模板编译缓存
'compile_cache' => true,
];
常用配置项说明:
view_path: 指定模板文件的根目录。view_suffix: 模板文件的后缀名,默认是html。layout_on / layout_name: 控制模板布局的开启和布局文件名。tpl_replace_string: 非常有用!用于在模板中替换常量,方便管理静态资源路径。tpl_cache: 是否开启模板缓存,开发时建议关闭,线上环境开启以提高性能。
总结与建议
| 风格类型 | 语法示例 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| ThinkPHP 标签 | {$name}, {volist}, {if} |
推荐,逻辑清晰,与 PHP 分离,易读易维护。 | 需要学习一套新的标签语法。 | 绝大多数项目,特别是团队协作项目。 |
| 原生 PHP | <?php echo $name; ?> |
无需学习,对 PHP 开发者极其熟悉。 | 破坏 MVC 分层,安全性较低(需小心 XSS),模板可读性差。 | 快速原型开发、处理极其复杂的单个逻辑片段。 |
| Twig | {{ name }}, {% for %} |
现代化、简洁、安全(自动转义)、功能强大。 | 需要额外安装和配置,学习成本。 | 喜欢 Twig 生态、追求更现代模板语法的项目。 |
最佳实践建议:
- 优先使用 ThinkPHP 标签语法:这是框架设计的初衷,能最好地发挥其优势,保持代码的规范性和可维护性。
- 善用模板继承和包含:这是构建清晰、可复用布局的关键。
- 合理使用
tpl_replace_string:统一管理静态资源路径,避免硬编码。 - 谨慎使用原生 PHP:仅在万不得已,且逻辑非常简单时使用,避免在模板中写复杂的业务逻辑。
- 为复杂项目考虑 Twig:如果你的团队对 Twig 更熟悉,或者项目对模板的纯净度和安全性有更高要求,切换到 Twig 是一个不错的选择。
