A-A+

smarty模板引擎简单思路的实现-smarty仿写之思路(二)

2014年12月26日 php 暂无评论 阅读 184 次
 在了解了如何写自己的smarty-smarty仿写之思路后,今天来继续简单实现, smarty模板引擎简单思路的实现-smarty仿写之思路(二),PHP模板引擎的作用是为了让表现层逻辑和页面本身分开,让程序员和美工的工作可以相对独立,并且减少集成时造成的额外工作量,模板引擎可以做到对Html页面中的变量、流程逻辑等内容用真实内容进行替换、并有缓存功能,减少每次解析的时间,说白了,模板引擎就是利用字符串替换来将模板用数据转换为真正要展示给用户的内容。
1. 原始的编写方法
  1. <?php
  2.         echo “hello world!”;
  3. ?>
2. 改进的方法
 Html:
  1. <html>
  2.    <body>
  3.       $var
  4.    </body>
  5. </html>
PHP:
  1. <?php
  2. //读取文件内容
  3. $filecontent;
  4. $fp=fopen($filename,'r');
  5. $filecontent=fread($fp,filesize($filename));
  6. fclose($fp);
  7. //用变量进行替换
  8. $realcontent=str_replace(“$var”,”hello world!”,$filecontent);
  9. //显示
  10. echo $realcontent;
  11. ?>
       这样,美工就可以针对html文件进行排版编辑,程序员则可以关注与代码实现。

3. 一个简单的模板引擎

  1. <?php
  2. //变量前界定符
  3.     var $left_limiter='<?=';
  4.     //变量后界定符    
  5.     var $right_limiter='?>';
  6.     //存储变量值的数组对象
  7.     var $assign_vars=array();
  8.     //遍历深度
  9.     var $searchlevel=2;
  10.     class templater
  11.     {
  12.         //将变量赋值给模板引擎
  13.         function assign($varnames,$varvalues)
  14.      {
  15.             //get variable name array
  16.             $arrvarname=explode(';',$varnames);
  17.             //get variable value array
  18.             if(count($arrvarname)<=1) //can support ";" in value
  19.                    $arrvarvalue=array($varvalues);
  20.             else //can not has ";" in variable name or variable value
  21.                    $arrvarvalue=explode(';',$varvalues);
  22.             //add to intenal variable array       
  23.             for($i=0;$i<count($arrvarname);$i++)
  24.             {
  25.                    $this->assign_vars[$arrvarname[$i]]=$arrvarvalue[$i];
  26.             }
  27.      }
  28.      //根据变量名、变量值、模板内容、界定符对内容中的变量用实际值进行替换
  29.      function parsevariable($content,$varname,$varvalue,$left_limiter='',$right_limiter='')
  30.      {
  31.             //get limiter
  32.             if(emptyempty($left_limiter))
  33.                    $left_limiter=$this->left_limiter;
  34.             if(emptyempty($right_limiter))
  35.                    $right_limiter=$this->right_limiter;
  36.             //get variable name
  37.             $varname=$this->wrapreskeyword($varname);
  38.             //parse variable value
  39.             foreach(array(preg_replace("/['\"]/","'",$varname),preg_replace("/['\"]/","\"",$varname)) as $tempvarname)
  40.                  $content=preg_replace("/".$this->wrapreskeyword($left_limiter)."\s*[$]".$tempvarname."\s*".$this->wrapreskeyword($right_limiter)."/i",$varvalue$content);
  41.             //return result 
  42.             return $content;
  43.      }
  44.               //返回替换后的内容
  45.               function get($templatefile)
  46.        {
  47.               global $template,$defaulttemplate;
  48.               //define variable     
  49.               $filecontent="";
  50.               //get template file content
  51.               if(file_exists($templatefile))   //if not exist,use default template
  52.                      $filecontent=readfilecontent($templatefile);
  53.               else
  54.                      $filecontent=readfilecontent(str_replace('/'.$template.'/','/'.$defaulttemplate.'/',$templatefile));
  55.               //replace every variable with value
  56.               for($i=0;$i<$this->searchlevel;$i++)
  57.               {
  58.                      foreach ($this->assign_vars as $varname=>$varvalue)
  59.                      {
  60.                             //convert variable with value               
  61.                             if(strpos($filecontent,$varname))
  62.                                    $filecontent=$this->parsevariable($filecontent,$varname,$varvalue);
  63.                      }
  64.               }
  65.               //return content
  66.               return $filecontent;
  67.        }
  68.     }
  69. //实际的用法
  70.        $objtemplate=new templater; //创建模板引擎对象
  71.        //变量赋值
  72.        $objtemplate->assign('var',”hello world!”);
  73.        //显示内容
  74.        echo $objtemplate->get("test.html");
  75. ?>

 

4.流程逻辑替换

缓存

性能

解决以上问题就可以是一个真正的模板引擎,以后的文章中会介绍如何编写一个功能强大的模板引擎!

给我留言

Copyright © web前端技术开发个人博客 保留所有权利  京ICP备14060653号 Theme  Ality

用户登录