模板引擎编译

前文中讲了模板引擎的缓存。话就不多说了。

模板引擎的编译分为变量替换,分支结构,数组循环遍历,以及模板之间的相互嵌套。对我现在的水平来说,暂时只学替换变量、include,至于替换里面的if foreach 等以后再学。模板引擎的继承下次写。我感觉那个对我现在有用。

    其实,说白了,模板引擎的替换怎么用就主要考两个函数assign() 和display();至于这两个函数的具体,见下文。

那么这个替换是怎么实现的呢。

对assign来说,就是把传入的参数$value不停的传给一个数组变量$tpl_vars 。而assign(a,b);中的

a只是数组变量的下标而已。

display就要复杂一点点了。因为它是把替换后的模板文件输出。所以第一步,它要找到模板文件,并根据模板文件是不是存在啊,有没有被修改啊,做出响应。思考、、、在哪里替换的。是用内部方法。。tpl_replace吗

最后再把替换后的模板文件包含即可。也就是说所有的那么多代码,真正起到作用的是最后一条包含语句。

/**
 * file:mytpl.class.php 类名为Mytpl的自定义模板引擎。通过该类对象加载模板文件并解析,将解析的结果输出。
 * 这里暂时只学替换变量、include,至于替换里面的if foreach 等以后再学
 */
class Mytpl{
    public  $template_dir="templates";//定义模板文件存放的目录 #为何一定要在这里加一个public否则就会报错?不用public用var也可以
    public $compile_dir="templates_c";//定义通过模板引擎组合后文件存放的位置
    public $left_delimeter="<{"; //在模板中嵌入动态数据变量的左定界符
    public $right_delimeter="}>";//在模板中嵌入动态数据变量的右定界符
    public $tpl_vars=array();//内部使用的临时变量
    /**
     * 将PHP中分配的值保存到成员属性$tpl_vars中,用于将模板中对应的变量进行替换
     * @param string $tpl_var 需要一个字符串参数作为关联数组下标,要和模板中的变量名对应。
     * @param mixed $value 需要一个变量类型的值,用来分配给模板中变量的值。
     */
    function assign($tpl_var,$value=null){
        if($tpl_var!="")
            $this->tpl_vars=$value;
    }
  
    /**
     * 加载指定目录下的模板文件,并将替换后的内容生成组合文件存放在另一个指定目录下
     * @param string $fileName 提供模板文件的文件名
     */
    function display($fileName){
       $tplfile=$this->template_dir.'/'.$fileName;//到指定的目录下寻找模板文件
   if(!file_exists($tplfile)) //如果需要处理的模板文件不存在,则退出并报告错误
       die ("Error,This file is not exist");
       $comFileName=  $this->compile_dir.'/'.$fileName.'php'; //获取组合的模板文件,该文件的内容都是被替换过的
   
       if(!file_exists($comFileName)||  filemtime($comFileName)<  filemtime($tplfile)){ //判断替换后的文件是否存在或是存在但模板文件有改动,都需要重新创建
           $repContent=$this->tpl_replace(file_get_contents($comFileName));//调用内部替换模板方法,file_get_contents把文件转化为字符串
           file_put_contents($comFileName, $repContent);//保存由系统组合后的脚本文件file_put_contents(a,b)把b保存为a;
           
       }
       
        include($comFileName);
    
    //包含处理后的模板文件输出给客户端
    } 
    
    /**
     * 内部使用的私有方法,使用正则表达式将模板文件中的'<{ }>'中的语句替换成对应的值或PHP代码
     * @param string $content   提供从模板文件中读入的全部内容字符串
     * @return $repContent       返回替换后的字符串
     * 知识点:
     * preg_quote(a,b)把a参数用反斜线进行转义。b为指定可选的参数,比如/。说明/也要被转义。 
     * 
     */
    private function tpl_replace($content){
      $left=  preg_quote($this->$left_delimeter,"/"); 
      $right= preg_quote($this->$right_delimeter,"/");//将左右定界符号中,有影响正则的特殊符号转义。例如<{ }> 转义 /</{/}/>
    $pattern=array(
       
        '/'.$left.'\s*\$([a-zA-Z_\x?f-\xff][a-zA-Z0-9_\x?f-\xff]*)\s*'.$right.'/i',
        '/'.$left.'\s*include\s+[\"\']?(.+?)[\"\']?\s*'.$right.'/ie'
    );//匹配模板中各种标识符的正则表达式的模式数组
    //匹配模板中变量,例如"<{ $var }>"
    //匹配include标识符,例如<{ include "header.html"}>
    //替换从模板中使用正则表达式匹配到的字符串数组
    //??????????????????
    $replacement=array(
            //替换模板中的变量<?php echo $this->tpl_vars["tpl_var"];
      
         //替换include字符串
         
    );
    
     //使用正则替换函数处理 ,在$content中 以$pattern 模式 匹配,用$replacement代替
     $repContent = preg_replace($pattern,$replacement,$content);
   //如果还有要替换的标识,递归调用自己再次替换
     if(preg_match('/'.$left.'([^('.$right.')]{1,})'.$right.'/'.$repContent)){
         $repContent=$this->tpl_replace($repContent);
     }
     //返回替换后的字符串
      return $repContent;
    }


转载于:https://my.oschina.net/yuanyichuan/blog/222099

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值