如何用thinkphp框架来写一个网站(php tpl模板引擎定义与使用示例)
类别:编程学习 浏览量:1602
时间:2021-11-03 15:49:06 如何用thinkphp框架来写一个网站
php tpl模板引擎定义与使用示例本文实例讲述了php tpl模板引擎定义与使用。分享给大家供大家参考,具体如下:
tpl.php
|
<?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,,,,从数据库中取值,作为参数传到模板文件,再解析模板文件
|
<?php 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程序设计有所帮助。
原文链接:https://blog.csdn.net/qq_42176520/article/details/80426384
您可能感兴趣
- php实现非递归快速排序(PHP实现无限极分类的两种方式示例递归和引用方式)
- php封装api(PHP常用的类封装小结4个工具类)
- phpsetcookie参数说明(PHP的cookie与session原理及用法详解)
- php系统化框架教程(PHP+swoole+linux实现系统监控和性能优化操作示例)
- phpcurl请求能在日志里记录吗(php使用curl模拟多线程实现批处理功能示例)
- php在if里添加xml代码(PHP创建XML接口示例)
- php扩展库使用教程(php使用pecl方式安装扩展操作示例)
- php数组练习题答案(PHP 数组黑名单/白名单实例代码详解)
- php建造者模式实例(PHP工厂模式、单例模式与注册树模式实例详解)
- php redis应用场景(PHP商品秒杀问题解决方案实例详解mysql与redis)
- php mq使用方法(PHP使用ActiveMQ实现消息队列的方法详解)
- thinkphp5访问路径(thinkphp5修改view到根目录实例方法)
- php怎么设计状态模式(php设计模式之观察者模式定义与用法经典示例)
- php函数的使用方法(PHP中str_split函数的用法讲解)
- php制作用户登录(php实现登录页面的简单实例)
- php漏洞处理方法(php解决安全问题的方法实例)
- 他是梁山最早的头目,江湖人称 旱地忽律 ,宋江几乎将其遗忘(他是梁山最早的头目)
- 梁山创始人杜迁,为何不受宋江待见,只排名83位(梁山创始人杜迁)
- 法国面包(法国面包法棍)
- 微信(微信分身)
- 双十二(双十二和双十一哪个划算)
- 佛肚竹盆景的养护之道(佛肚竹盆景的养护之道)
热门推荐
- sqlserver备份整表数据的语句(SqlServer批量备份多个数据库且删除3天前的备份)
- mysql8.0如何配超时时间(解决MySQL8.0时区的问题步骤)
- 判断iframe是否加载完成
- sql server网络配置
- python正式参数(详解Python的三种可变参数)
- css的4个基础选择器(详解css常用选择器)
- laravel测试重连数据库(Laravel关系模型指定条件查询方法)
- 织梦cms漏洞大全(织梦CMS利用php正则让文章的外链自动加nofollow)
- cssborder三角形怎么画(使用CSS的border属性绘制各种几何形状的方法)
- laravel设置读写权限(解决laravel上传图片之后,目录有图片,但是访问不到404的问题)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9