如何用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
您可能感兴趣
- thinkphp5框架怎么打开(thinkphp5.1框架中容器Container和门面Facade的实现方法分析)
- thinkphp框架实例(ThinkPHP框架整合微信支付之JSAPI模式图文详解)
- php制作用户登录(php实现登录页面的简单实例)
- php面向对象如何开发(PHP创建对象的六种方式实例总结)
- 用php递归函数实现阶乘的计算(php求斐波那契数的两种实现方式递归与递推)
- phpstudy默认不支持64位php的解决方法(phpstudy默认不支持64位php的解决方法)
- php 创建定时任务(PHP扩展Swoole实现实时异步任务队列示例)
- php网站经典案例(PHP生成短网址的思路以及实现方法的详解)
- php框架创建控制器代码(php连接sftp的作用以及实例代码)
- php与xml文件(PHP读取XML文件的方法实例总结DOMDocument及simplexml方法)
- thinkphp快速入门手册(从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解)
- 深入理解php 变量(不常用但很实用的PHP预定义变量分析)
- php开发技巧和方法(php+ajax实现商品对比功能示例)
- php中trim函数(PHP中ltrim函数的用法与实例讲解)
- phparray函数的用法(php array_chunk函数用法与注意事项)
- dedecms版本介绍(解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法)
- 做技术难吗(技术难不难)
- 林心如是谁(林心如是谁演的)
- 泰国安全吗(泰国安全吗2023)
- 菲律宾安全吗(菲律宾安全吗)
- 泰国旅游攻略(泰国旅游攻略必去景点)
- 数字藏品市场有多乱 周杰伦丢了 一只猴 ,损失超300万(数字藏品市场有多乱)
热门推荐
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9