设为首页 收藏本站
查看: 837|回复: 0

[经验分享] 如何用PHP来编写自己的模板引擎

[复制链接]

尚未签到

发表于 2017-4-8 10:59:47 | 显示全部楼层 |阅读模式
       本文的目的不是为了让大家学会如何编写一个完善的模板引擎,只是为了给PHP初学入门者解释模板引擎的原理和作用。

       PHP模板引擎的作用是为了让表现层逻辑和页面本身分开,让程序员和美工的工作可以相对独立,并且减少集成时造成的

额外工作量,模板引擎可以做到对Html页面中的变量、流程逻辑等内容用真实内容进行替换、并有缓存功能,减少每次解析的时间,说白了,模板引擎就是利用字符串替换来将模板用数据转换为真正要展示给用户的内容。

 

1. 原始的编写方法

<?php
echo “hello world!”;
?>
 内容和页面结合在一起。

 

2. 改进的方法

 

Html:

       
<html>
<body>
$var
</body>
</html>
 

 

PHP:

        
<?php
//读取文件内容
$filecontent;      
$fp=fopen($filename,'r');
$filecontent=fread($fp,filesize($filename));
fclose($fp);
//用变量进行替换
$realcontent=str_replace(“$var”,”hello world!”,$filecontent);
//显示
echo $realcontent;
?>
 

 

       这样,美工就可以针对html文件进行排版编辑,程序员则可以关注与代码实现。

 

3. 一个简单的模板引擎

    
<?php
//变量前界定符
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. 需要扩展的功能

 

流程逻辑替换

缓存

性能

 

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



 

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-361882-1-1.html 上篇帖子: PHP框架queryphp教程:入门五 独立使用ORM类 下篇帖子: php中json_decode()和json_encode()的使用方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表