设为首页 加入收藏

TOP

前端学PHP之自定义模板引擎(一)
2017-10-10 10:51:10 】 浏览:2469
Tags:前端 PHP 定义 模板 引擎

前面的话

  在大多数的项目组中,开发一个Web程序都会出现这样的流程:计划文档提交之后,前端工程师制作了网站的外观模型,然后把它交给后端工程师,它们使用后端代码实现程序逻辑,同时使用外观模型做成基本架构,然后工程被返回到前端工程师继续完善。就这样工程可能在后端工程师和前端工程师之间来来回回好几次。由于后端工程师不干预任何相关HTML标签,同时也不需要前端代码和后端代码混合在一起。前端工程师只需要配置文件,动态区块和其他的界面部分,不必要去接触那些错综复杂的后端代码。因此,这时候有一个很好的模板支持就显得很重要了。本文将详细介绍PHP中的模板引擎

 

概述

  什么是网站模板?准确地说,是指网站页面模板,即每个页面仅是一个板式,包括结构、样式和页面布局,是创建网页内容的样板,也可以理解为已有的网页框架。可以将模板中原有的内容替换成从服务器端数据库中动态内容,目的是可以保持页面风格一致

  PHP是一种HTML内嵌式的在服务器端执行的脚本语言,所以大部分PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程。虽然通过MVC设计模式可以把程序应用逻辑与网页呈现逻辑强制性分离,但也只是将应用程序的输入、处理和输出分开,网页呈现逻辑(视图)还会有HTML代码和PHP程序强耦合在一起。PHP脚本的编写者必须既是网页设计者,又是PHP开发者

  现在已经有很多解决方案,可以将网站的页面设计和PHP应用程序几乎完全分离。这些解决方案称为“模板引擎”,它们正在逐步消除由于缺乏层次分离而带来的难题。模板引擎的目的,就是要达到上述提到的逻辑分离的功能。它能让程序开发者专注于资料的控制或是功能的达成。因此,模板引擎很适合公司的Web开发团队使用,使每个人都能发挥其专长

  模板引擎技术的核心比较简单。只要将前端页面指定为模板文件,并将这个模板文件中动态的内容,如数据库输出、用户交互等部分,定义成使用特殊“定界符”包含的“变量”,然后放在模板文件中相应的位置。当用户浏览时,由PHP脚本程序打开该模板文件,并将模板文件中定义的变量进行替换。这样,模板中的特殊变量被替换为不同的动态内容时,就会输出需要的页面

  目前,可以在PHP中应用的并且比较成熟的模板有很多,例如Smarty、PHPLIB、IPB等几十种。使用这些通过PHP编写的模板引擎,可以让代码脉络更加清晰,结构更加合理化。也可以让网站的维护和更新变得更容易,创造一个更加良好的开发环境,让开发和设计工作更容易结合在一起。但是,没有哪一个PHP模板是最合适、最完美的。因为PHP模板就是大众化的东西,并不是针对某个人开发的。如果能在对模板的特点、应用有清楚的认识基础上,充分认识到模板的优势劣势,就可以知道是否选择使用模板引擎或选择使用哪个模板引擎

 

自定义模板引擎类

  自定义模板引擎,能够更好的掌握模板引擎的工作机制,为学习Smarty做好准备。更重要的是,属于自己的PHP模板引擎永远不是固定不变的,可以根据项目的需要为其量身定制

  在下例中,通过前面介绍的模板引擎概念创建了属于自己的一个简单模板引擎,可以用来处理模板的基本功能。例如:变量替换、分支结构、数组循环遍历,以及模板之间相互嵌套等,如下所示:

<?php
    /**
        file: mytpl.class.php 类名为MyTpl是自定义的模板引擎
        通过该类对象加载模板文件并解析,将解析后的结果输出 
    */
    class Mytpl {
        public $template_dir = 'templates';       //定义模板文件存放的目录  
        public $compile_dir = 'templates_c';      //定义通过模板引擎组合后文件存放目录
        public $left_delimiter  =  '<{';          //在模板中嵌入动态数据变量的左定界符号
        public $right_delimiter =  '}>';          //在模板中嵌入动态数据变量的右定界符号
        private $tpl_vars = array();              //内部使用的临时变量
        
        /** 
            将PHP中分配的值会保存到成员属性$tpl_vars中,用于将模板中对应的变量进行替换  
            @param    string    $tpl_var    需要一个字符串参数作为关联数组下标,要和模板中的变量名对应    
            @param    mixed    $value        需要一个标量类型的值,用来分配给模板中变量的值      
        */
        function assign($tpl_var, $value = null) {   
            if ($tpl_var != '')                   
                $this->tpl_vars[$tpl_var] = $value;
        }
        
        /** 
            加载指定目录下的模板文件,并将替换后的内容生成组合文件存放到另一个指定目录下
            @param    string    $fileName    提供模板文件的文件名                                             
        */
         function display($fileName) { 
            /* 到指定的目录中寻找模板文件 */
            $tplFile = $this->template_dir.'/'.$fileName;  
            /* 如果需要处理的模板文件不存在,则退出并报告错误 */
            if(!file_exists($tplFile)) {                   
                die("模板文件{$tplFile}不存在!");
            }
            /* 获取组合的模板文件,该文件中的内容都是被替换过的 */
            $comFileName = $this->compile_dir."/com_".$fileName.'.php';  
            /* 判断替换后的文件是否存在或是存在但有改动,都需要重新创建 */
            if(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) {
                /* 调用内部替换模板方法 */
                $repContent = $this->tpl_replace(file_get_contents($tplFile));  
                /* 保存由系统组合后的脚本文件 */
                file_put_contents($comFileName, $repContent);
            }
            /* 包含处理后的模板文件输出给客户端 */
            include($comFileName);                  
        }
        
        /**  
            内部使用的私有方法,使用正则表达式将模板文件'<{ }>'中的语句替换为对应的值或PHP代码 
            @param    string    $content    提供从模板文件中读入的全部内容字符串   
            @return    $repContent            返回替换后的字符串
        */
        private function tpl_replace($content) {
            /* 将左右定界符号中,有影响正则的特殊符号转义  例如,<{ }>转义\<\{ \}\> */
            $left = preg_quote($this->left_delimiter, '/');
            $right = preg_quote($this->right_delimiter, '/');

            /* 匹配模板中各种标识符的正则表达式的模式数组 */
            $pattern = array(       
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇专业定制开发微信红包游戏牛牛|接.. 下一篇专业定制开发微信红包游戏牛牛|接..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目