本文实例讲述了php tpl模板引擎定义与使用。分享给大家供大家参考,具体如下:

tpl.php

namespace tpl;

/**

* Class Tpl

*/

class Tpl

{

protected $view_dir;//模板文件

protected $cache_dir;//缓存文件

protected $lifetime;//过期时间

protected $vars = [];//存放显示变量的数组

/**

* Tpl constructor.

* @param string $view_dir

* @param string $cache_dir

* @param string $lifetime

*/

public function __construct($view_dir='', $cache_dir='', $lifetime='')

{

//如果模板文件不为空,则设置,为空则为默认值

if (!empty($view_dir)) {

if ($this->check_dir($view_dir)) {

$this->view_dir = $view_dir;

}

}

//如果缓存文件不为空,则设置,为空时为默认值

if (!empty($cache_dir)) {

if ($this->check_dir($cache_dir)) {

$this->cache_dir = $cache_dir;

}

}

//如果过期时间不为空,则设置,为空时为默认值

if (!empty($lifetime)) {

$this->lifetime = $lifetime;

}

}

/**

* 对外公开的方法

* @param string $name

* @param string $value

*/

public function assign($name, $value)

{

$this->vars[$name] = $value;//将传入的参数以键值对存入数组中

}

/**

* 测试文件

* @param $dir_path

* @return bool

*/

protected function check_dir($dir_path)

{

//如果文件不存在或不是文件夹,则创建

if (!file_exists($dir_path) || !is_dir($dir_path)) {

return mkdir($dir_path, 0777, true);

}

//如果文件不可读或不可写,则设置模式

if (!is_writable($dir_path) || !is_readable($dir_path)) {

return chmod($dir_path, 0777);

}

return true;

}

/**

* 展示方法

* @param $view_name

* @param bool $isInclude

* @param null $uri

*/

public function display($view_name, $isInclude=true, $uri=null)

{

//通过传入的文件名,得到模板文件路径

$view_path = rtrim($this->view_dir, '/') . '/' . $view_name;

//判断路径是否存在

if (!file_exists($view_path)) {

die('文件不存在');

}

//通过传入的文件名得到缓存文件名

$cache_name = md5($view_name . $uri) . '.php';

//缓过缓存文件名得到缓存路径

$cache_path = rtrim($this->cache_dir, '/') . '/' .$cache_name;

//判断缓存文件是否存在,如果不存在,重新生成

if (!file_exists($cache_path)) {

$php = $this->compile($view_path);//解析模板文件

file_put_contents($cache_path, $php);//缓存文件重新生成

} else {

//如果缓存文件存在,判断是否过期,判断模板文件是否被修改

$is_time_out = (filectime($cache_path) + $this->lifetime) > time() ? false : true;

$is_change = filemtime($view_path) > filemtime($cache_path) ? true : false;

//如果缓存文件过期或模板文件被修改,重新生成缓存文件

if ($is_time_out || $is_change) {

$php = $this->compile($view_path);

file_put_contents($cache_path, $php);

}

}

if ($isInclude) {

extract($this->vars);//解析传入变量的数组

include $cache_path;//展示缓存

}

}

/**

* 正则解析模板文件

* @param string $file_name

* @return mixed|string

*/

protected function compile($file_name)

{

$html = file_get_contents($file_name);//获取模板文件

//正则转换数组

$array = [

'{$%%}' => '=$\1?>',

'{foreach %%}' => '<?php foreach (\1): ?>',

'{/foreach}' => '<?php endforeach ?>',

'{include %%}' => '',

'{if %%}' => '<?php if (\1): ?>',

'{/if}' => '<?php endif ?>',

'{for %%}' => '<?php for (\1): ?>',

'{/for}' => '<?php endfor ?>',

'{switch %%}' => '<?php switch (\1) ?>',

'{/switch}' => '<?php endswitch ?>'

];

//遍历数组,生成正则表达式

foreach ($array AS $key=>$value) {

//正则表达式,

$pattern = '#' . str_replace('%%', '(.+?)' , preg_quote($key, '#')) . '#';

if (strstr($pattern, 'include')) {

$html = preg_replace_callback($pattern, [$this, 'parseInclude'], $html);

} else {

$html = preg_replace($pattern, $value, $html);

}

}

return $html;

}

/**

* 处理include表达式

* @param array $data

* @return string

*/

protected function parseInclude($data)

{

$file_name = trim($data[1], '\'"');

$this->display($file_name, false);

$cache_name = md5($file_name) . '.php';

$cache_path = rtrim($this->cache_dir, '/') . '/' . $cache_name;

return '<?php include "'.$cache_path.'" ?>';

}

}

user_tpl,,,,从数据库中取值,作为参数传到模板文件,再解析模板文件

include './sql/pdo.sql.php';

include 'tpl.php';

$tpl = new tpl\Tpl('./view/', './cache/', 3000);

$link = new pdo_sql();

$dat = ['menu_name', 'menu_url'];

$res = $link->table('blog_menu')->field($dat)->order('id ASC')->select();

$tpl->assign('menu', $res);

$tpl->display('index.html');

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP模板技术总结》、《PHP基于pdo操作数据库技巧总结》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

php tpl 模板 用法,php tpl模板引擎定义与使用示例相关推荐

  1. Android Studio 模板用法与自定义模板

    本文gif图比较多,可能会导致页面加载缓慢,请大家耐心等待 今天我们来学习下Android Studio这款软件的一些秘密,这些就是Template,就是我们输出一些特定的字符就可以实现自动编写一大堆 ...

  2. request用法_Go 语言 Web 应用开发 第 04 课:高级模板用法

    在上一节课中,我们学习了标准库中 text/template 包提供的文本模板引擎的逻辑控制.集合对象迭代和空白符号处理的用法.这节课,我们将学习标准库模板引擎中的一些高级概念和使用方法,并将渲染结果 ...

  3. swig模板 PHP,nodejs前端模板引擎swig入门

    相对于jade,我还是更喜欢swig前端模板引擎,jade虽然语法简练高效了不少,但是在我这最大的问题是 他没有一个html该有的样子... 所以我还是决定使用swig,页面结构,样子都是熟悉的样子, ...

  4. dz每个php模板页文件,dz模板引擎分析

    在UCH中,模板与动态数据分离,所以在很多php文件的最后,我们会看到包含了模板文件,如cp_blog.php最后有include_once template("cp_blog") ...

  5. Django模板用法

    django模板原理 # 创建template对象,由context对象传递template所需要的值, 有render方法进行模板的呈现 # 写模板,创建 Template 对象,创建 Contex ...

  6. JavaWeb学习之路——SpringBoot 中thymeleaf模板用法(三)

    thymeleaf模板用法 thymeleaf通过它特定的语法,对HTML的标记做渲染,能够访问后台的动态数据,实现静态html界面的动态化 1.添加架包 <!--引入动态模板-->< ...

  7. wxWidgets:wxScopedCharTypeBuffer< T >类模板用法

    wxWidgets:wxScopedCharTypeBuffer< T >类模板用法 wxWidgets:wxScopedCharTypeBuffer< T >类模板用法 用法 ...

  8. wxWidgets:wxPixelData< Image, PixelFormat >类模板用法

    wxWidgets:wxPixelData< Image, PixelFormat >类模板用法 wxWidgets:wxPixelData< Image, PixelFormat ...

  9. wxWidgets:wxObjectDataPtr< T >类模板用法

    wxWidgets:wxObjectDataPtr< T >类模板用法 wxWidgets:wxObjectDataPtr< T >类模板用法 用法详细说明 wxWidgets ...

最新文章

  1. MySQL的安装和初次使用
  2. oralce 角色 权限
  3. css margin-top设置html元素之间的距离
  4. cmd命令将web项目打成jar包_2020全网首发!JDK14之jpackage命令尝鲜
  5. 使用anaconda安装pytorch的清华镜像地址
  6. JavaScript 和 typeScript 中的 import、from
  7. 基于深度学习的搜索、推荐、广告系统最全最新论文分享
  8. 人脸关键点:DAN-Deep Alignment Network: A convolutional neural network for robust face alignment
  9. 分布式多级缓存中间件引导实践
  10. php文章上一篇,thinkphp5实现文章上一篇,下一篇
  11. pip下载速度慢的解决方法
  12. 火山PC加载DLL窗口案例教程
  13. 网站微信扫码登录实现步骤
  14. java 毫秒转分钟和秒_Java程序将毫秒转换为分钟和秒
  15. 微信即时通信原理_企业即时通讯工具需注意哪些问题
  16. 华为路由器时区以及时间配置
  17. Java实现简单四则运算
  18. win10服务器网页打不开怎么办,win10系统ie浏览器有些网页打不开怎么回事
  19. 华为机试-题目核心考点
  20. Python学习记录(一)

热门文章

  1. 阿里大牛都在读的10本Java实战书籍,Java开发进阶必备书单
  2. CS4344/45/46/48
  3. Tomcat环境SSL证书安装教程
  4. 播音主持学习心得之腔调的重要性
  5. vulnhub DC系列 DC-6
  6. 设计界面实现后台按键和鼠标点击操作
  7. 华师大计算机研究生学硕学费,2021年华东师范大学硕士研究生学费标准公示
  8. 同等学力计算机综合国考复习方法
  9. 记录篇---实习成长
  10. MT5自动打开全部主力连续合约图表