您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 写一个属于自己的模板引擎
毛毛虫教你写一个属于自己的模板引擎(全)Smarty一直被人视为是多余的东西,我觉得认为Smarty多余的人才是多余的....不说这些了。今天我就教大家写个模板引擎,让大家都可以写一个属于自己的模板引擎,而且看完这篇文章之后,你对Smarty的认识会更进一步的。我的模板引擎名叫Stupid(傻瓜的意思),我不喜欢太聪明的东西!Stupid模板引擎是由3个文件组成,他们分别是:stupid.class.php,stupid_parser.class.php,stupid_debugger.class.php。Stupid.class.php的任务是设置变量,模板路径,和显示等功能,而stupid_parser.class.php就是编译模板文件的,stupid_debugger.class.php是用来调试用的。好了,我们现在就先编写stupid.class.php吧。1.新建一个PHP文件名为:stupid.class.php。我们的类叫Stupid,我们先设计一下成员变量吧。成员变量有:$_tpl_vars,$_tpl_file,$_parser,$_debugger;$_tpl_vars:用来保存模板变量的;$_tpl_file:用来保存模板文件名的;$_parser:保存StupidParser对象的,就是编译对象;$_debugger:保存StupidDebug对象的,就是调试对象;下面定义了两个常量,用来存放模板文件夹和编译文件夹的:define('TPL_DIR','./templates/');define('TPL_C_DIR','./templates_c/');开始编码了复制PHP内容到剪贴板PHP代码:复制代码1.2.?php3.define('TPL_DIR','./templates/');4.define('TPL_C_DIR','./templates_c/');5.6.classStupid{7.private$_tpl_vars;8.private$_tpl_file;9.private$_parser;10.private$_debugger;11.}12.?开始写个构造器吧复制PHP内容到剪贴板PHP代码:复制代码1.2.publicfunctionStupid(){3.if(!is_dir(TPL_DIR)||!is_dir(TPL_C_DIR)){4.exit('错误:请正确设置模板文件夹和编译文件夹');5.}6.}在构造器中,我们判断了模板路径和编译路径是否设置正确.设计我们的方法我们这个类中主要有以下方法:assign(),set_tpl_dir(),set_parsed_dir(),display(),debug().assign()方法:assign()的用处是设置模板变量.代码如下复制PHP内容到剪贴板PHP代码:复制代码1.2.publicfunctionassign($var,$value){3.if(isset($var)&&trim($var)!=''){4.$this-_tpl_vars[$var]=$value;5.returntrue;6.}else{7.exit('错误:请设置变量名');8.}9.}我们先判断用户是否设置了变量名,用isset($var)&&trim($var)!=''来判断,trim($var)!=''是防止用户以空格来设置变量名.如果设置变量正确,我们就将他保存到成员变量_tpl_vars中.display()方法display()方法是Stupid类中最重要的方法,他是用来显示和检测模板是否更新了,更新了就再编译,没有更新就用原来编译之后的文件.代码如下复制PHP内容到剪贴板PHP代码:复制代码1.2.publicfunctiondisplay($tpl_file){3.$template_file=TPL_DIR.$tpl_file;4.if(!file_exists($template_file)){5.exit('错误:模板文件不存在');6.}7.8.$parsed_file=TPL_C_DIR.md5($tpl_file).'.php';9.if(!file_exists($parsed_file)||filemtime($parsed_file)filemtime($template_file)){10.require_once'./stupid_parser.class.php';11.$this-_parser=newStupidParser();12.$this-_parser-compile($tpl_file);13.}14.include$parsed_file;15.}这个方法是根据!file_exists($parsed_file)||filemtime($parsed_file)filemtime($template_file)这条语句来判断是否编译过和模板文件是否更新过,没有编译过和更新过模板文件都要重新编译.我们就要引入stupid_parser.class.php,并创建StupidParser对象,对模板文件进行编译.编译完,我们就引入编译之后的文件.这个编译之后的模板文件就是一个普通的PHP文件.debug()方法Debugg()方法就比较简单,就是引入stupid_debugger.class.php文件,创建StupidDebuger对象,调用StupidDebuger的start方法进行调试.代码如下复制PHP内容到剪贴板PHP代码:复制代码1.2.publicfunctiondebug($tpl_file){3.if(include_once(stupid_debugger.class.php)){4.$this-_debugger=newStupidDebugger($tpl_file);5.$this-_debugger-start();6.}else{7.exit('错误:Debuger类文件不存在');8.}9.}至此,我们的Stupid类就写完了!下次我要介绍StupidParser类的编写.请继续支持.大家有什么意见或者建议可以提出!showshow全相:复制PHP内容到剪贴板PHP代码:复制代码1.2.?php3.define('TPL_DIR','./templates/');4.define('TPL_C_DIR','./templates_c/');5.classStupid{6.private$_tpl_vars;7.private$_tpl_file;8.private$_parser;9.private$_debug;10.11.publicfunctionStupid(){12.if(!is_dir(TPL_DIR)||!is_dir(TPL_C_DIR)){13.exit('错误:请正确设置模板文件夹和编译文件夹');14.}15.}16.17.publicfunctionassign($var,$value){18.if(isset($var)&&trim($var)!=''){19.$this-_tpl_vars[$var]=$value;20.returntrue;21.}else{22.exit('错误:请设置变量名');23.}24.}25.26.publicfunctiondisplay($tpl_file){27.$template_file=TPL_DIR.$tpl_file;28.if(!file_exists($template_file)){29.exit('错误:模板文件不存在');30.}31.32.$parsed_file=TPL_C_DIR.md5($tpl_file).'.php';33.if(!file_exists($parsed_file)||filemtime($parsed_file)filemtime($template_file)){34.require_once'./stupid_parser.class.php';35.$this-_parser=newStupidParser();36.$this-_parser-compile($tpl_file);37.}38.include$parsed_file;39.}40.41.functiondebug($tpl_file){42.if(include_once(stupid_debugger.class.php)){43.$this-_debugger=newStupidDebugger($tpl_file);44.$this-_debugger-start();45.}else{46.exit('错误:Debuger类文件不存在');47.}48.}49.}50.?51.第二篇编译篇(转载请注明:phpchina毛毛虫)编译篇终于更新了!真对不起大家,要大家等了那么久。上次的教程我改了一点地,所以请再去看看上次的教程。事先声明,这次的教程要一定的正则表达式的基础,没有正则表达式的基础的话,先去认识一下正则表达式。在上一篇,我们介绍了Stupid类的编写和功能,今天要介绍的是StupidParser类,他是用来编译模板的,就像Smarty一样(当然没有smarty功能那么强大啦~不过我们也有我们的特色)。不多说,现在开始把!新建文件stupid_parser.class.php。先定义我们的类StupidParser:复制PHP内容到剪贴板PHP代码:复制代码1.2.?php3.classStupidParser{4.5.}我们这个只要一个成员变量就可以了,就是$template,他是用来保存模板的内容的。复制PHP内容到剪贴板PHP代码:复制代码1.2.?php3.classStupidParser{4.private$template;5.}我们先写个set_file()的方法吧,他是用来设置和读取模板文件的。复制PHP内容到剪贴板PHP代码:复制代码1.2.privatefunctionset_file($file){3.$file=TPL_DIR.$file;4.if(!file_exists($file)){5.exit('错误:模板文件不存在');6.}7.$fp=fopen($file,'r');8.if(!$fp)exit('错误:不能打开文件');9.if(filesize($file)){10.$this-template=fread($fp,filesize($file));11.}else{12.exit('错误:模板文件大小为零');13.}14.fclose($fp);15.returntrue;16.}这个方法主要是检测模板文件存不存在和读取模板文件的内容,并把内容放置到成员变量$template中。---------------------------------------------------------------------------------------------好了,现在我们定义我们的模板规则吧:1.匹配变量的模式:{$var_name}2.匹配条件的模式:{ifcondition}.....................{/if}3.匹配注释的模式:{#}.......................................{#}4.匹配包含文件的模式:{includefile_name}5.匹配foreach的模式(循环数组):{$array_name-foreach(key,value)}....................{/foreach}6.foreach中的变量表示:{@key}{@value}---------------------------------------------
本文标题:写一个属于自己的模板引擎
链接地址:https://www.777doc.com/doc-4164383 .html