当前位置:  -> 首页 -> 如何用PHP来编写自己的模板引擎

上一篇 | 下一篇
如何用PHP来编写自己的模板引擎
作者:洛羽叶  点击率:2553  发布时间:2009-01-27

       本文的目的不是为了让大家学会如何编写一个完善的模板引擎,只是为了给PHP初学入门者解释模板引擎的原理和作用。

       PHP模板引擎的作用是为了让表现层逻辑和页面本身分开,让程序员和美工的工作可以相对独立,并且减少集成时造成的
额外工作量,模板引擎可以做到对Html页面中的变量、流程逻辑等内容用真实内容进行替换、并有缓存功能,减少每次解析的时间,说白了,模板引擎就是利用字符串替换来将模板用数据转换为真正要展示给用户的内容。
 
1. 原始的编写方法
<?php
        echo “hello world!”;
?>
 
内容和页面结合在一起。
 
2. 改进的方法
 
Html:
        <html>
        <body>
               $var
        </body>
        </html>
 
PHP:
        //读取文件内容
$filecontent;       
$fp=fopen($filename,'r');
$filecontent=fread($fp,filesize($filename));
fclose($fp);
 
//用变量进行替换
$realcontent=str_replace(“$var”,”hello world!”,$filecontent);
 
//显示
echo $realcontent;
 
       这样,美工就可以针对html文件进行排版编辑,程序员则可以关注与代码实现。
 
3. 一个简单的模板引擎
    //变量前界定符
    var $left_limiter='<?=';
   
    //变量后界定符    
    var $right_limiter='?>';
   
    //存储变量值的数组对象
    var $assign_vars=array();
   
    //遍历深度
    var $searchlevel=2;
    class templater   
    {
        //将变量赋值给模板引擎
        function assign($varnames,$varvalues)
     {
            //get variable name array
            $arrvarname=explode(';',$varnames);
           
            //get variable value array
            if(count($arrvarname)<=1) //can support ";" in value
                   $arrvarvalue=array($varvalues);
            else //can not has ";" in variable name or variable value
                   $arrvarvalue=explode(';',$varvalues);
           
            //add to intenal variable array       
            for($i=0;$i<count($arrvarname);$i++)
            {                         
                   $this->assign_vars[$arrvarname[$i]]=$arrvarvalue[$i];                    
            }
     }
 
     //根据变量名、变量值、模板内容、界定符对内容中的变量用实际值进行替换
     function parsevariable($content,$varname,$varvalue,$left_limiter='',$right_limiter='')
     {
            //get limiter
            if(empty($left_limiter))
                   $left_limiter=$this->left_limiter;
            if(empty($right_limiter))
                   $right_limiter=$this->right_limiter;
                  
            //get variable name
            $varname=$this->wrapreskeyword($varname);                
           
            //parse variable value
            foreach(array(preg_replace("/['\"]/","'",$varname),preg_replace("/['\"]/","\"",$varname)) as $tempvarname)
                 $content=preg_replace("/".$this->wrapreskeyword($left_limiter)."\s*[$]".$tempvarname."\s*".$this->wrapreskeyword($right_limiter)."/i",$varvalue, $content);                                                        
           
            //return result 
            return $content;           
     }
             
              //返回替换后的内容
              function get($templatefile)
       {                  
              global $template,$defaulttemplate;
             
              //define variable     
              $filecontent="";
             
              //get template file content
              if(file_exists($templatefile))   //if not exist,use default template
                     $filecontent=readfilecontent($templatefile);         
              else
                     $filecontent=readfilecontent(str_replace('/'.$template.'/','/'.$defaulttemplate.'/',$templatefile));        
             
              //replace every variable with value
              for($i=0;$i<$this->searchlevel;$i++)
              {
                     foreach ($this->assign_vars as $varname=>$varvalue)             
                     {    
                            //convert variable with value               
                            if(strpos($filecontent,$varname))                             
                                   $filecontent=$this->parsevariable($filecontent,$varname,$varvalue);               
                     }
              }
                    
              //return content
              return $filecontent;
       }
    }
      
//实际的用法
 
       $objtemplate=new templater; //创建模板引擎对象
 
       //变量赋值
       $objtemplate->assign('var',”hello world!”);  
 
       //显示内容
       echo $objtemplate->get("test.html");    
 
4. 需要扩展的功能
 
流程逻辑替换
缓存
性能
 
解决以上问题就可以是一个真正的模板引擎,以后的文章中会介绍如何编写一个功能强大的模板引擎!
 
 
 
标签: PHP 模板引擎
引用地址:本站原创
   站点首页      技术人生      旅途足迹      我要留言      友情链接      关于站长   
[本站统计]
在线人数:1
今日访问:11
总访问量:1465543
Copyright 2006-2022 EasyWeb 1.6 订阅 All Rights Reserved
粤ICP备08028977号-1
www.luoriver.com
Created by WWH in 2006