php开发中用什么模板(PHP模版引擎原理、定义与用法实例)
类别:编程学习 浏览量:1945
时间:2022-03-31 20:06:07 php开发中用什么模板
PHP模版引擎原理、定义与用法实例本文实例讲述了PHP模版引擎原理、定义与用法。分享给大家供大家参考,具体如下:
template存放模版源文件
模版编译工具类
Compline.class.php
|
<?php /** * 模板编译工具类 */ class Compile { private $template ; //带编译文件 private $content ; //需要替换的文本 private $comfile ; //编译后的文件 private $left = '{' ; //左界定符 private $right = '}' ; //右界定符 private $value = array (); //值栈 private $php_turn ; private $T_P = array (); private $T_R = array (); public function __construct( $template , $compileFile , $config ) { $this ->template = $template ; $this ->comfile = $compileFile ; $this ->content = file_get_contents ( $template ); if ( $config [ 'php_turn' ] === false) { $this ->T_P[] = "/<\?(=|php|)(.+?)\?>/is" ; $this ->T_R[] = "<? \\1\\2? >" ; } //{$var} $this ->T_P[] = "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/" ; //{foreach $b}或者{loop $b} $this ->T_P[] = "/\{(loop|foreach) \\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/i" ; //{[K|V]} $this ->T_P[] = "/\{([K|V])\}/" ; //{/foreach}或者{\loop}或者{\if} $this ->T_P[] = "/\{\/(loop|foreach|if)}/i" ; //{if (condition)} $this ->T_P[] = "/\{if (.* ?)\}/i" ; //{(else if | elseif)} $this ->T_P[] = "/\{(else if|elseif) (.* ?)\}/i" ; //{else} $this ->T_P[] = "/\{else\}/i" ; //{#...# 或者 *...#,注释} $this ->T_P[] = "/\{(\#|\*)(.* ?)(\#|\*)\}/" ; $this ->T_R[] = "<?php echo \$this->value['\\1']; ?>" ; $this ->T_R[] = "<?php foreach ((array)\$this->value['\\2'] as \$K => \$V) { ?>" ; $this ->T_R[] = "<?php echo \$\\1; ?>" ; $this ->T_R[] = "<?php } ?>" ; $this ->T_R[] = "<?php if (\\1) { ?>" ; $this ->T_R[] = "<?php }else if (\\2) { ?>" ; $this ->T_R[] = "<?php }else{ ?>" ; $this ->T_R[] = "" ; } public function compile() { $this ->c_all(); $this ->c_staticFile(); file_put_contents ( $this ->comfile, $this ->content); } public function c_all() { $this ->content = preg_replace( $this ->T_P, $this ->T_R, $this ->content); } /** * 加入对JavaScript文件的解析 * @return [type] [description] */ public function c_staticFile() { $this ->content = preg_replace( '/\{\!(.* ?)\!\}/' , '<script src=\\1' . '?t=' .time(). '></script>' , $this ->content); } public function __set( $name , $value ) { $this -> $name = $value ; } public function __get( $name ) { if (isset( $this -> $name )) { return $this -> $name ; } else { return null; } } } |
Template.class.php
|
<?php /** * Template */ class Template { private $arrayConfig = array ( 'suffix' => '.tpl' , //模板的后缀 'templateDir' => 'template/' , //模板所在的文件夹 'compileDir' => 'cache/' , //编译后存放的目录 'cache_html' => true, //是否需要编译成静态的html文件 'suffix_cache' => '.html' , //设置编译文件的后缀 'cache_time' => 7200, //设置多长时间自动更新 'php_turn' => true, //设置是否支持php原生代码 'debug' => false, ); public $file ; //模板文件名,不带路径 public $debug = array (); //调试信息 private $value = array (); //值栈 private $compileTool ; //编译器 private $controlData = array (); static private $instance = null; //模板类对象 public function __construct( $arrayConfig = array ()) { $this ->debug[ 'begin' ] = microtime(true); $this ->arrayConfig = array_merge ( $this ->arrayConfig, $arrayConfig ); $this ->getPath(); if (! is_dir ( $this ->arrayConfig[ 'templateDir' ])) { exit ( "template dir isn't found!" ); } if (! is_dir ( $this ->arrayConfig[ 'compileDir' ])) { if ( strtoupper ( substr (PHP_OS,0,3)) === 'WIN' ) { mkdir ( $this ->arrayConfig[ 'compileDir' ]); } else { mkdir ( $this ->arrayConfig[ 'compileDir' ], 0770, true); } } include ( 'Compile.class.php' ); } public function getPath() { $this ->arrayConfig[ 'templateDir' ] = strstr ( realpath ( $this ->arrayConfig[ 'templateDir' ]), '\\' , '/' ). '/' ; $this ->arrayConfig[ 'compileDir' ] = strstr ( realpath ( $this ->arrayConfig[ 'compileDir' ])), '\\' , '/' ). '/' ; } /** * 取得模板引擎的实例 */ public static function getInstance() { if ( is_null (self:: $instance )) { self:: $instance = new Template(); } return self:: $instance ; } /** * 单独设置引擎参数 * 也支持一次性设置多个参数 */ public function setConfig( $key , $value = null) { if ( is_array ( $key )) { $this ->arrayConfig = $key + $this ->arrayConfig; } else { $this ->arrayConfig[ $key ] = $value ; } } /** * 获取当前模板引擎配置,仅供调试使用 */ public function getConfig( $key = null) { if ( $key && array_key_exists ( $key , $this ->arrayConfig)) { return $this ->arrayConfig[ $key ]; } else { return $this ->arrayConfig; } } /** * 注入单个变量 */ public function assign( $key , $value ) { $this ->value[ $key ] = $value ; } /** * 注入数组变量 */ public function assignArray( $array ) { if ( is_array ( $array )) { foreach ( $array as $k => $v ) { $this ->value[ $k ] = $v ; } } } /** * 获取模板的位置 * @return [type] [description] */ public function path() { return $this ->arrayConfig[ 'templateDir' ]. $this ->file. $this ->arrayConfig[ 'suffix' ]; } /** * 判断配置文件是否要求缓存 */ public function needCache() { return $this ->arrayConfig[ 'cache_html' ]; } /** * 判断是否需要缓存 */ public function reCache( $file ) { $flag = false; $cacheFile = $this ->arrayConfig[ 'compileDir' ].md5( $file ). $this ->arrayConfig[ 'suffix_cache' ]; if ( $this ->arrayConfig[ 'cache_html' ] === true) { //需要缓存 $timeFlag = (time() - @ filemtime ( $cacheFile )) < $this ->arrayConfig[ 'cache_time' ] ? true : false; if ( is_file ( $cacheFile ) && filesize ( $cacheFile ) > 1 && $timeFlag ) { //缓存存在且未过期 $flag = true; } else { $flag = false; } } return $flag ; } /** * 展示模板 */ public function show( $file ) { $this ->file = $file ; if (! is_file ( $this ->path())) { exit ( '找不到对应的模板' ); } $compileFile = $this ->arrayConfig[ 'compileDir' ].md5( $file ). '.php' ; $cacheFile = $this ->arrayConfig[ 'compileDir' ].md5( $file ). $this ->arrayConfig[ 'suffix_cache' ]; if ( $this ->reCache( $file ) === false) { //如果需要缓存 $this ->debug[ 'cached' ] = 'false' ; $this ->compileTool = new Compile( $this ->path(), $compileFile , $this ->arrayConfig); if ( $this ->needCache()) { ob_start(); } extract( $this ->value, EXTR_OVERWRITE); if (! is_file ( $compileFile ) || fileatime ( $compileFile ) < filemtime ( $this ->path())) { $this ->compileTool->value = $this ->value; $this ->compileTool->compile(); include $compileFile ; } else { include $compileFile ; } if ( $this ->needCache()) { $message = ob_get_contents(); file_put_contents ( $cacheFile , $message ); } } else { readfile( $cacheFile ); $this ->debug[ 'cached' ] = 'true' ; } $this ->debug[ 'spend' ] = microtime(true) - $this ->debug[ 'begin' ]; $this ->debug[ 'count' ] = count ( $this ->value); $this ->debug_info(); } public function debug_info() { if ( $this ->arrayConfig[ 'debug' ] === true) { echo "<br/>" , '-------------------- debug_info--------------' , "<br/>" ; echo '程序运行日期:' , date ( "Y-m-d h:i:s" ), "<br/>" ; echo '模板解析耗时:' , $this ->debug[ 'spend' ], '秒' , "<br/>" ; echo '模板包含标签数目:' , $this ->debug[ 'count' ], "<br/>" ; echo '是否使用静态缓存:' , $this ->debug[ 'cached' ], "<br/>" ; echo '模板引擎实例参数:' , var_dump( $this ->getConfig()); } } /** * 清楚缓存的html文件 * @return [type] [description] */ public function clean() { if ( $path === null) { $path = $this ->arrayConfig[ 'compileDir' ]; $path = glob ( $path . '* ' . $this ->arrayConfig[ 'suffix_cache' ]); } else { $path = $this ->arrayConfig[ 'compileDir' ].md5( $path ). $this ->arrayConfig[ 'suffix_cache' ]; } foreach (( array ) $path as $v ) { unlink( $v ); } } } |
test.php
|
<?php include 'Template.class.php' ; $tpl = new Template( array ( 'debug' => true)); $tpl ->assign( 'data' , 'hello world' ); $tpl ->assign( 'person' , 'htGod' ); $tpl ->assign( 'data1' , 3); $arr = array (1,2,3,4, '5' ,6); $tpl ->assign( 'b' , $arr ); $tpl ->show( 'member' ); |
希望本文所述对大家PHP程序设计有所帮助。
您可能感兴趣
- linux下如何启动phpstudy面板(详解phpstudy linux web面板小皮面板V0.2版本正式发布)
- pyclips入门(phpinfo的知识点总结)
- phpstudy不解析php代码(phpstudy伪静态设置的问题)
- linux中ceph的状态(Wdcp linux控制面板配置多PHP版本记录)
- php获取网页内容的几种方法(PHP实现的文件浏览器功能简单示例)
- php中怎么分割数组(PHP实现数组根据某个字段进行水平合并,横向合并案例分析)
- php教程字符串类型进阶技术教程(PHP中有关长整数的一些操作教程)
- docker部署php本地开发环境(CentOS7环境下使用Docker搭建PHP运行环境的过程详解)
- php运用redis实现抢购实例(PHP+redis实现微博的拉模型案例详解)
- php如何定时执行某项(php解决crontab定时任务不能写入文件问题的方法分析)
- php实战小实例(php实现推荐功能的简单实例)
- php 常见的设计模式(PHP中常用的三种设计模式详解单例模式、工厂模式、观察者模式)
- php批量导出所有数据库(php快速导入大量数据的实例方法)
- php验证码思路(PHP实现字母数字混合验证码功能)
- php数组是怎么实现的(PHP里的$_GET数组介绍)
- php防session劫持(使用SMB共享来绕过php远程文件包含的限制执行RFI的利用)
- 爱情是什么(爱情是什么最经典的话)
- 乔欣 古装剧中的高颜值(古装剧中的高颜值)
- 怎么才可以财富自由(如何让自己实现财富自由)
- 为什么越来越多年轻人回农村(为什么越来越多年轻人回农村生活)
- 怎么快速学好英语(怎么快速学好英语初中)
- 中国留学生都是富二代吗()
热门推荐
- C#正则表达式验证是否日期
- django分页器图(Django框架实现分页显示内容的方法详解)
- 面试时的着装打扮
- dedecms无缩略图怎么设置(DEDECMS转移data目录后 验证码不显示解决办法)
- mysql 高级用法(MySQL实现replace函数的几种实用场景)
- SqlParameter用法
- css弹性布局设置每行显示指定个数(CSS实现多行多列的布局的实例代码)
- pythonopencv自定义阈值算法(理想高通滤波实现Python opencv示例)
- python什么是深拷贝什么是浅拷贝(Python深拷贝与浅拷贝用法实例分析)
- canvas跟随鼠标绘制(如何在Canvas上的图形/图像绑定事件监听的实现)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9