• 技术文章 >后端开发 >php教程

    一个编译型的PHP模板引擎大致实现过程_PHP教程

    2016-07-13 17:52:34原创414
    JTemplate.class.php

    001
    002
    /**
    003
    * @author Jiawei
    004
    * @Completed in 2012-6-29 0:23
    005
    */
    006
    class JTemplate{
    007
    //通过assign函数传入的变量临时存放数组
    008
    private $templateVar = array();
    009
    //模板目录
    010
    private $templateDir = '';
    011
    //编译目录
    012
    private $templateCompileDir = '';
    013

    014
    private $fileName = '';
    015
    /**
    016
    * 构造函数
    017
    * @param string $templateDir 模板目录
    018
    * @param string $templateComplieDir 模板编译目录
    019
    */
    020
    public function __construct($templateDir,$templateComplieDir){
    021
    $this->templateDir = $templateDir;
    022
    $this->templateCompileDir = $templateComplieDir;
    023
    }
    024
    /**
    025
    * 显示模板
    026
    * @param string $fileName 模板文件名
    027
    */
    028
    public function display($fileName){
    029
    $this->fileName = $fileName;
    030
    if(file_exists($this->templateDir.'/'.$this->fileName)){
    031
    $compileFileName = $this->templateCompileDir.'/'.$this->file_safe_name().'.php';
    032
    if(!file_exists($compileFileName) || filemtime($compileFileName)< filemtime($this->templateDir.'/'.$this->fileName)){
    033
    $this->del_old_file();
    034
    $this->compile();
    035
    }
    036
    extract($this->templateVar);
    037
    include $compileFileName;
    038
    }else{
    039
    $this->error('Sorry,the template file '.$this->fileName.' does not exist!!');
    040
    }
    041
    }
    042
    /**
    043
    * 获取编译文件名
    044
    */
    045
    private function get_compile_file(){
    046
    $compileFile = explode('.',$this->fileName);
    047
    unset($compileFile[count($compileFile)-1]);
    048
    return implode('.',$compileFile);
    049
    }
    050
    /**
    051
    * 编译
    052
    */
    053
    private function compile(){
    054
    $fileHandle = @fopen($this->templateDir.'/'.$this->fileName, 'r');
    055
    while(!feof($fileHandle)){
    056
    $fileContent = fread($fileHandle,1024);
    057
    }
    058
    fclose($fileHandle);
    059
    $fileContent = $this->template_replace($fileContent);
    060
    //$compileFile = $this->get_compile_file($fileName);
    061
    $fileHandle = @fopen($this->templateCompileDir.'/'.$this->file_safe_name().'.php','w');
    062
    if($fileHandle){
    063
    fwrite($fileHandle, $fileContent);
    064
    fclose($fileHandle);
    065
    }else{
    066
    $this->error('Sorry,Compile dir can not write!');
    067
    }
    068
    }
    069
    /**
    070
    * 模板传值
    071
    * @param string $valueName 模板中使用的变量名
    072
    * @param $value 变量值
    073
    */
    074
    public function assign($valueName,$value){
    075
    $this->templateVar[$valueName] = $value;
    076
    }
    077

    078
    /**
    079
    * 模板正则替换
    080
    * @param string $content 替换内容
    081
    * @return string 替换过后的内容
    082
    */
    083
    private function template_replace($content){
    084
    $orginArray = array(
    085
    '//s',
    086
    '//s',
    087
    '/(.+?)/s',
    088
    '//s',
    089
    '//s',
    090
    '//s',
    091
    '//s',
    092
    '//s',
    093
    '/\{P:(.+?)\:}/s',
    094
    '/\{C:(\w+)\}/s',
    095
    '/\{I:(.+?)\}/s',
    096
    '/\{F:(.+?)\}/s',
    097
    '/\{EF:(.+?)\}/s',
    098
    '/\{([a-zA-Z0-9_\[\]\'\"\$\.\x7f-\xff]+)\}/s',
    099
    );
    100

    101
    $changeArray = array(
    102
    '',
    103
    '$$3){$countLoop++;?>',
    104
    '$1',
    105
    '',
    106
    '',
    107
    '',
    108
    '',
    109
    '',
    110
    '',
    111
    '',
    112
    'templateDir.'/$1";?>',
    113
    '',
    114
    '',
    115
    '',
    116
    );
    117
    return $repContent=preg_replace($orginArray,$changeArray,$content);
    118
    }
    119
    /**
    120
    * 删除旧文件
    121
    */
    122
    private function del_old_file(){
    123
    $compileFile = $this->get_compile_file($this->fileName);
    124
    $files = glob($this->templateCompileDir.'/'.$compileFile.'*.php');
    125
    // print_r($files);
    126
    if($files){
    127
    @unlink($files[0]);
    128
    }
    129
    }
    130
    /**
    131
    * 编译文件名安全处理方法
    132
    * @return string 返回编译文件名
    133
    */
    134
    private function file_safe_name(){
    135
    $compileFile = $this->get_compile_file($this->fileName);
    136
    return $compileFile.filemtime($this->templateDir.'/'.$this->fileName);
    137
    }
    138

    139
    /**
    140
    * 错误输出函数
    141
    * @param string $content 错误输出信息
    142
    */
    143
    private function error($content){
    144
    $stringHtml = '

    ';
    145
    $stringHtml .= 'Error information:
    ';
    146
    $stringHtml .= '';
    147
    $stringHtml .= $content;
    148
    $stringHtml .= '
    ';
    149
    $stringHtml .= '
    ';
    150
    exit($stringHtml);
    151
    }
    152
    }
    153
    ?>
    index.php

    view sourceprint?
    01
    02
    /**
    03
    * @author Jiawei
    04
    */
    05
    include_once 'JTemplate/JTemplate.class.php';
    06
    $template = new JTemplate('template','compile');
    07
    $a = array('a','b','c','d');
    08
    define('_CORE_','aaa');
    09
    $template->assign('a', $a);
    10
    $template->display('index.html');
    11
    ?>
    作者:袁家伟

    www.bkjia.comtruehttp://www.bkjia.com/PHPjc/478121.htmlTechArticleJTemplate.class.php 001 ?php 002 /** 003 * a href=http://my.oschina.net/arthor target=_blank rel=nofollow@author/a Jiawei 004 * @Completed in 2012-6-29 0:23 005 */ 006 class JTempl...

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:一个 编译型 PHP 模板 引擎 大致 实现 过程 JTemplate.class.php php 002 003
    上一篇:php_server详解_PHP教程 下一篇:浅谈php中使用绝对路径和相对路径_PHP教程
    PHP编程就业班

    相关文章推荐

    • 带你聊聊PHP中的泛型之基础知识浅析• PHP高并发实例详解之解决商品库存超卖问题• 十天学会php之第三天_php基础• php将数组存储为文本文件方法汇总_PHP• 再点一次Active的名,我把你的函数功能扩充了一下,嘻嘻,现在能_PHP

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网