## 介绍 `think-template`是一个基于PHP`5.6+`实现的编译型模板引擎,主要特性包括: - 支持XML标签库和普通标签的混合定义; - 支持直接使用PHP代码书写; - 支持文件包含; - 支持多级标签嵌套; - 支持布局模板功能; - 一次编译多次运行,编译和运行效率非常高; - 模板文件和布局模板更新,自动更新模板缓存; - 系统变量无需赋值直接输出; - 支持多维数组的快速输出; - 支持模板变量的默认值; - 支持页面代码去除Html空白; - 支持变量组合调节器和格式化功能; - 允许定义模板禁用函数和禁用PHP语法; - 通过标签库方式扩展; 功能特性和ThinkPHP`5.1`内置的模板引擎基本一致,适用于没有使用`ThinkPHP`框架但希望找一个高性能的编译型模板引擎的情况。 ## 安装 通过`composer`直接安装即可 ~~~php composer require topthink/think-template ~~~ ## 用法示例 在根目录下创建`index.php`入口文件测试: ~~~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} ``` 也可以直接调用对象的常量或者方法 ~~~cmd 常量:{$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`标签来防止模板标签被解析,例如: ~~~cmd {literal} Hello,{$name}! {/literal} ~~~ 上面的`{$name}`标签被`literal`标签包含,因此并不会被模板引擎解析,而是保持原样输出。 `literal`标签还可以用于页面的JS代码外层,确保JS代码中的某些用法和模板引擎不产生混淆。 总之,所有可能和内置模板引擎的解析规则冲突的地方都可以使用`literal`标签处理。 ## 模板注释 模板支持注释功能,该注释文字在最终页面不会显示,仅供模板制作人员参考和识别。 ### 单行注释 格式: ~~~cmd {/* 注释内容 */ } 或 {// 注释内容 } ~~~ 例如: ~~~cmd {// 这是模板注释内容 } ~~~ > 注意`{`和注释标记之间不能有空格。 ### 多行注释 支持多行注释,例如: ~~~cmd {/* 这是模板 注释内容*/ } ~~~ 模板注释支持多行,模板注释在生成编译缓存文件后会自动删除,这一点和Html的注释不同。 更多的关于模板引擎以及标签的详细用法参考[ThinkPHP5.1手册的模板章节](https://www.kancloud.cn/manual/thinkphp5_1/354069)。