温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

php如何制作模版引擎

发布时间:2021-08-31 11:44:36 来源:亿速云 阅读:165 作者:小新 栏目:开发技术

这篇文章主要介绍php如何制作模版引擎,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

PHP模板引擎就是一个PHP类库,使用它可以使PHP代码和HTML代码进行分离,使代码的可读性和维护性得到显著提高。而且这样做的好处是,让美工专心设计HTML前台页面,程序员专心去写PHP业务逻辑。因此,模化引擎很适合公司的Web开发团队使用,使每个人都能发挥其特长

parser.class.php

<?php   /**  * 模版解析类  */ class Parser {   // 字段,接收模版文件内容   private $_tpl;       // 构造方法,获取模版文件内容   public function __construct($_tplFile)   {     if (! $this->_tpl = file_get_contents($_tplFile)) {       exit('ERROR:模版文件读取错误');     }   }       // 解析普通变量   private function parvar()   {     $_patten = '/<!--\s+\{\$([\w]+)\}\s+-->/';     if (preg_match($_patten,$this->_tpl)) {       $this->_tpl = preg_replace($_patten, "<?php echo \$this->_vars['$1'];?>",$this->_tpl);     }   }     //解析IF语句   private function parif(){     $_pattenif = '/<!--\s+\{if\s+\$([\w]+)\}\s+-->/';     $_pattenElse = '/<!--\s+\{else\}\s+-->/';     $_pattenEndif = '/<!--\s+\{\/if\}\s+-->/';     if (preg_match($_pattenif,$this->_tpl)) {       if (preg_match($_pattenEndif,$this->_tpl)) {         $this->_tpl = preg_replace($_pattenif,"<?php if (\$this->_vars['$1']){?>",$this->_tpl);         $this->_tpl = preg_replace($_pattenEndif,"<?php } ?>",$this->_tpl);         if (preg_match($_pattenElse,$this->_tpl)) {           $this->_tpl = preg_replace($_pattenElse,"<?php }else{?>",$this->_tpl);         }       }else{       echo 'ERROR:IF语句没有关闭!';       }     }   }     //PHP注释解析     private function parCommon(){     $_pattenCommon = '/<!--\s+\{#\}(.*)\{#\}\s+-->/';     if (preg_match($_pattenCommon,$this->_tpl)) {       $this->_tpl = preg_replace($_pattenCommon,"<?php /* $1 */ ?>",$this->_tpl);     }   }       //解析foreach语句   private function parForeach(){     $_pattenForeach = '/<!--\s+\{foreach\s+\$([\w]+)\(([\w]+),([\w]+)\)\}\s+-->/';     $_pattenForeachEnd = '/<!--\s+\{\/foreach\}\s+-->/';     $_pattenForeachValue = '/<!--\s+\{@([\w]+)\}\s+-->/';     if (preg_match($_pattenForeach,$this->_tpl)) {       if (preg_match($_pattenForeachEnd,$this->_tpl)) {         $this->_tpl = preg_replace($_pattenForeach, "<?php foreach (\$this->_vars['$1'] as \$$2=>\$$3) {?>", $this->_tpl);         $this->_tpl = preg_replace($_pattenForeachEnd, "<?php }?>", $this->_tpl);         if (preg_match($_pattenForeachValue, $this->_tpl)) {           $this->_tpl = preg_replace($_pattenForeachValue,"<?php echo \$$1;?>",$this->_tpl);         }       }else{       echo 'ERROR:Foreach语句没有关闭!';         }     }   }     //解析include方法   private function parInclude(){     $_pattenInclude = '/<!--\s+\{include\s+file=\"([\w\.\-]+)\"\}\s+-->/';     if (preg_match($_pattenInclude,$this->_tpl,$_file,$_file)) {       if (!file_exists($_file[1])||empty($_file)) {         echo 'ERROR:包含文件出错!';       }       $this->_tpl = preg_replace($_pattenInclude,"<?php include '$1';?>",$this->_tpl);     }   }     //解析系统变量方法   private function parConfig(){     $_pattenConfig = '/<!--\s+\{([\w]+)\}\s+-->/';     if (preg_match($_pattenConfig,$this->_tpl)) {       $this->_tpl = preg_replace($_pattenConfig,"<?php echo \$this->_config['$1'];?>",$this->_tpl);     }   }   // 对外公共方法   public function compile($_path)   {     // 解析模版文件     $this->parvar();     $this->parif();     $this->parForeach();     $this->parInclude();     $this->parCommon();     $this->parConfig();     // 生成编译文件     if (! file_put_contents($_path, $this->_tpl)) {       exit('ERROR:编译文件生成错误!');     }   } } ?>

Templates.class.php

<?php   /**  * 模版类  */ class Templates {   //注入变量   private $_vars = array();   //保存系统变量数组字段   private $_config = array();   //创建一个构造方法,来检测各个目录是否存在   public function __construct()   {     if (! is_dir(TPL_DIR) || ! is_dir(TPL_C_DIR) || ! is_dir(CACHE) || !is_dir(CONFIG)) {       echo 'ERROR:模版目录或编译目录,缓存目录不存在!自动创建!'."<br />";       if (!is_dir(TPL_DIR)) {         mkdir(TPL_DIR);         echo '模版目录'.TPL_DIR.'建立'."<br />";       }       if (!is_dir(TPL_C_DIR)) {         mkdir(TPL_C_DIR);         echo '编译目录'.TPL_C_DIR.'建立'."<br />";       }       if (!is_dir(CACHE)) {         mkdir(CACHE);         echo '缓存目录'.CACHE.'建立'."<br />";       }       if (!is_dir(CONFIG)) {         mkdir(CONFIG);         echo '缓存目录'.CONFIG.'建立'."<br />";       }       exit();     }     //保存系统变量     $_sxe = simplexml_load_file(CONFIG.'/config.xml');     $_tagLib = $_sxe->xpath('/root/taglib');     foreach ($_tagLib as $_tag) {       $this->_config["$_tag->name"] = $_tag->value;     }   }     //assign()方法,用于注入变量   public function assign($_var,$_value){     //$_var用于同步模版里的变量名     //$_value表示值     if (isset($_var)&&!empty($_var)) {       $this->_vars[$_var] = $_value;     }else{       exit('ERROR:设置模版变量!');     }     }     //display()方法   public function display($_file)   {     $_tplFile = TPL_DIR . $_file;     // 判断文件是否存在     if (! file_exists($_tplFile)) {       echo 'ERROR:模版文件不存在!自动创建Index.tpl模版文件!';       file_put_contents($_tplFile,'Index');       exit();     }       //生成编译文件     $_path = TPL_C_DIR.md5($_file).'-'.$_file.'.php';     //缓存文件     $_cacheFile = CACHE.md5($_file).'-'.$_file.'.html';     //当第二次运行相同文件,直接载入缓存文件     if (IS_CACHE) {       //判断缓存文件和编译文件都存在       if (file_exists($_cacheFile)&&file_exists($_path)) {         //判断模版文件是否修改过         if (filemtime($_path)>=filemtime($_tplFile)&&filemtime($_cacheFile)>=filemtime($_path)) {           include $_cacheFile;           echo '<!--cache-->';           return;         }       }     }     //当编译文件不存在或者文件发生改变则重新生成     if (!file_exists($_path)||filemtime($_path)<filemtime($_tplFile)) {       require ROOT_PATH.'/Class/parser.class.php';       //构造方法是传入模版文件地址       $_parser = new Parser($_tplFile);       //传入编译文件地址       $_parser->compile($_path);     }     //载入编译文件     include $_path;     if (IS_CACHE) {       //获取缓冲区数据       file_put_contents($_cacheFile,ob_get_contents());       //清楚缓冲区       ob_end_clean();       //载入缓存文件       include $_cacheFile;     }   } } ?>

templates.php

<?php //设置字符编码UTF-8 header('Content-Type:text/html;charset=utf-8');   //网站根目录 define('ROOT_PATH',dirname(__FILE__));   //存放模版文件夹 define('TPL_DIR',ROOT_PATH.'/Templates/');   //编译文件夹 define('TPL_C_DIR',ROOT_PATH.'/Templates_c/');   //缓存文件夹 define('CACHE',ROOT_PATH.'/Cache/');   //系统变量配置目录 define('CONFIG',ROOT_PATH.'/Config/');   //是否开启缓冲区 define('IS_CACHE',false);//false   //判断是否需要开启 IS_CACHE ? ob_start() : null;   //引入模版类 require ROOT_PATH.'/Class/Templates.class.php';   //实例化模版类 $_tpl=new Templates();   $_tpl->display('index.tpl'); ?>

templates/index.tpl

<!DOCTYPE html> <html lang="zn-cn"> <head>   <meta charset="UTF-8">   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">   <meta name="description" content="">   <meta name="keywords" content="">   <meta name="author" content="">   <meta name="author" content="">   <title><!-- {WebName} --></title>   <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">   <link rel="stylesheet" type="text/css" href="css/style.css">   </head> <body>   <!-- {#}php注释{#} --> <!-- {if $a} --> 123 <!-- {else} --> 321 <!-- {/if} --> <br /> <!-- {foreach $array(key,value)} -->   <!-- {@key} -->...<!-- {@value} --><br /> <!-- {/foreach} --> 系统变量<!-- {WebName} --><br /> 普通变量<!-- {$name} --><br />   <script src="/js/jquery-2.2.1.min.js" type="text/javascript"></script>   <script src="/js/bootstrap.min.js" type="text/javascript"></script>   <script type="text/javascript">   </script> </body> </html>

config/config.xml

<?xml version="1.0" encoding="UTF-8"?> <root>   <taglib>     <name>WebName</name>     <value>XXX网站</value>   </taglib> </root>

以上是“php如何制作模版引擎”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI