简单的模板引擎

觉得基础不扎实,框架又非常臃肿,想要用原生php写东西。

还是沿用了基本的MVC思路。

  • autoload一些核心类的原理。

在入口文件里包含的类的__autoload并不会尝试加载。(__autoload — Attempt to load undefined class)

这时候就可以用spl_autoload_register()来注册自己想要自动加载的函数:

spl_autoload_register(array('ClassName','autoload'));

注意:SPL是Standard PHP Library 的缩写,php5中引入。

看到了两个模板引擎的代码:

1.http://www.lanzusheng.cn/Article/32.html

2.http://www.luoriver.com/news-d-i146.html

第一个看得有点晕,仔细研究了第二个方法,虽然没有像第一个那些实现一些流程判断,但是足够用了:

 //变量前界定符
    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");

感觉受到smarty影响,所以界定符还是换成 { },毕竟比<?php ?>美观。。


转载于:https://my.oschina.net/sikou/blog/636003

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值