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程序设计有所帮助。
您可能感兴趣
- php数据错误处理函数(php中错误处理操作实例分析)
- php逐行读写文件(PHP实现读取文件夹及批量重命名文件操作示例)
- php数组详解(php数组和链表的区别总结)
- php上传文件的要求(PHP 文件上传限制问题)
- php图片合成处理(PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例)
- php实现导航地图(php根据地址获取百度地图经纬度的实例方法)
- dedecms新字段(DEDECMSv5.6 tags.php标签不能按照时间排序的问题)
- php 面向对象与面向过程(php面向对象重点知识分享)
- thinkphp5怎么设置当前的模块(thinkPHP5.1框架中Request类四种调用方式示例)
- php中钩子的理解与实例教程(php中钩子hook的原理与简单应用demo示例)
- thinkphp5数据库配置(Thinkphp5框架实现获取数据库数据到视图的方法)
- phpstudy默认不支持64位php的解决方法(phpstudy默认不支持64位php的解决方法)
- php100种算法(php实现的生成排列算法示例)
- php怎么创建一个文件(PHP文件后缀不强制为.php方法)
- js和php加密(RSA实现JS前端加密与PHP后端解密功能示例)
- phpstudy服务器怎么设置(PHPStudy打开网页很慢的原因及解决方案)
- 记忆中的台词(记忆中的台词)
- 袁冰妍轧戏 拍《琉璃》的同时还在拍《将夜》,难怪被骂演技差(拍琉璃的同时还在拍将夜)
- 刚红就耍大牌,《琉璃》角色滤镜碎一地,心疼工作人员(琉璃角色滤镜碎一地)
- 袁冰妍郑业成这对可以处,有脸红情话他们是真的敢说(袁冰妍郑业成这对可以处)
- 《祝卿好》台词又土又甜,就喜欢这么直接的恋爱(祝卿好台词又土又甜)
- 大女主 汤唯垂青电视圈,搭档朱亚文出演《大明皇妃孙若微传》(汤唯垂青电视圈)
热门推荐
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9