介绍
think-template
是一个基于PHP5.6+
实现的编译型模板引擎,主要特性包括:
- 支持XML标签库和普通标签的混合定义;
- 支持直接使用PHP代码书写;
- 支持文件包含;
- 支持多级标签嵌套;
- 支持布局模板功能;
- 一次编译多次运行,编译和运行效率非常高;
- 模板文件和布局模板更新,自动更新模板缓存;
- 系统变量无需赋值直接输出;
- 支持多维数组的快速输出;
- 支持模板变量的默认值;
- 支持页面代码去除Html空白;
- 支持变量组合调节器和格式化功能;
- 允许定义模板禁用函数和禁用PHP语法;
- 通过标签库方式扩展;
功能特性和ThinkPHP5.1
内置的模板引擎基本一致,适用于没有使用ThinkPHP
框架但希望找一个高性能的编译型模板引擎的情况。
安装
通过composer
直接安装即可
composer require topthink/think-template
用法示例
在根目录下创建index.php
入口文件测试:
<?php
namespace think;
require __DIR__.'/vendor/autoload.php';
// 设置模板引擎参数
$config = [
// 模板文件目录
'view_path' => './template/',
// 模板编译缓存目录(可写)
'cache_path' => './runtime/',
// 模板文件后缀
'view_suffix' => 'html',
];
$template = new Template($config);
// 模板变量赋值
$template->assign('name','thinkphp');
// 读取模板文件渲染输出
$template->fetch('index');
更多的模板引擎参数可以参考
fetch
方法必须指定模板文件名(不需要后缀和路径),上面的代码对应的模板文件位于 ./template/index.html
。
然后就可以在模板文件中输出模板变量
Hello,{$name}!
执行入口文件应该会看到输出
Hello,thinkphp!
变量输出的定界符支持自定义,例如:
$config = [
// 模板文件目录
'view_path' => './template/',
// 模板编译缓存目录(可写)
'cache_path' => './runtime/',
// 模板文件后缀
'view_suffix' => 'html',
// 模板引擎普通标签开始标记
'tpl_begin' => '{',
// 模板引擎普通标签结束标记
'tpl_end' > '}',
];
如果要批量给模板变量赋值,可以用
// 批量赋值
$template->assign([
'name' => 'thinkphp',
'foo' => 'bar',
]);
支持直接渲染内容输出,不需要定义模板文件
$template = new Template($config);
// 模板变量赋值
$template->assign('name','thinkphp');
// 渲染内容输出
$content = 'Hello,{$name}!';
$template->display($content);
所有的模板变量默认输出都会自动进行转义处理,以避免XSS
攻击的可能性。如果你不需要进行任何的转义,可以使用|raw
保持原样不做转义输出(例如输出HTML内容的时候需要)。
Hello,{$name|raw}!
数组和对象输出
如果需要在模板中输出数组,可以使用
{$item.name}
// 或者
{$item['name']}
要输出对象的属性,可以使用
{$object->name}
也可以直接调用对象的常量或者方法
常量:{$object::CONST_NAME}
方法:{$object->method()}
支持函数
{$name|strtolower|strip_tags}
系统变量输出
如果需要输出系统变量,可以不需要赋值给模板变量然后输出,可以直接在模板文件中输出系统变量,例如:
{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
{$Think.session.user_id} // 输出$_SESSION['user_id']变量
{$Think.get.page} // 输出$_GET['page']变量
{$Think.cookie.name} // 输出$_COOKIE['name']变量
支持输出 $_SERVER
、$_ENV
、 $_POST
、 $_GET
、 $_REQUEST
、$_SESSION
和 $_COOKIE
变量。
如果系统常量直接使用
{$Think.PHP_VERSION}
运算符
我们可以对模板输出使用运算符,包括如下支持。
运算符 | 使用示例 |
---|---|
+ |
{$a+$b} |
- |
{$a-$b} |
* |
{$a*$b} |
/ |
{$a/$b} |
% |
{$a%$b} |
++ |
{$a++} 或 {++$a} |
-- |
{$a--} 或 {--$a} |
综合运算 | {$a+$b*10+$c} |
在使用运算符的时候,不再支持前面提到的函数过滤用法,例如:
{$user.score+10} //正确的
{$user['score']+10} //正确的
{$user['score']*$user['level']} //正确的
{$user['score']|myFun*10} //错误的
{$user['score']+myFun($user['level'])} //正确的
三元运算
模板可以支持三元运算符,例如:
{$status? '正常' : '错误'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
还支持如下的写法:
{$name ?? '默认值'}
原样输出
可以使用literal
标签来防止模板标签被解析,例如:
{literal}
Hello,{$name}!
{/literal}
上面的{$name}
标签被literal
标签包含,因此并不会被模板引擎解析,而是保持原样输出。
literal
标签还可以用于页面的JS代码外层,确保JS代码中的某些用法和模板引擎不产生混淆。
总之,所有可能和内置模板引擎的解析规则冲突的地方都可以使用literal
标签处理。
模板注释
模板支持注释功能,该注释文字在最终页面不会显示,仅供模板制作人员参考和识别。
单行注释
格式:
{/* 注释内容 */ } 或 {// 注释内容 }
例如:
{// 这是模板注释内容 }
注意
{
和注释标记之间不能有空格。
多行注释
支持多行注释,例如:
{/* 这是模板
注释内容*/ }
模板注释支持多行,模板注释在生成编译缓存文件后会自动删除,这一点和Html的注释不同。