• PHP实现简易的模板引擎


    PHP实现简易的模板引擎

    1.MVC简介

    MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度):

    1. Model(模型)表示应用程序核心(比如数据库记录列表)。
    2. View(视图)显示数据(数据库记录)
    3. Controller(控制器)处理输入(写入数据库记录)。

    [百度百科]

    MVC的流程图如下(来源百度百科):
    流程图

    2.本文重点:模板引擎

    在视图层,PHP可以采用两种方式编写:

    1. PHP代码和HTML代码混写,甚至JavaScript等
    2. 采用模板引擎使得数据和显示分离,这种方式更易于维护。

      首先让我们来看一下混写代码:

      <!DOCTYPE html> 
      <html>
      <head>
      <title>混写代码</title>
      </head>
      <body>
          商品信息:
          <?php 
          mysql_connect("localhost","root","") or die("conect failed:".mysql_error());
          mysql_select_db("shop");
          $result = mysql_query("select * from sh_goods");
      ?>
          <ul>
              <?php while (mysql_fetch_array($result)) {?>
                  <li><?php echo $result['good_name']; ?></li>
              <?php } ?>
          </ul>
          <?php 
              mysql_free_result($result);
              mysql_close();
          ?>
      </body>
      </html>

    这种方式往往随着前端逻辑的复杂度变得越来越大,代码的可读性也会变得很差,代码的可重用性也不好。(比如我们需要重复的编写从数据库中获取数据的代码)

    模板引擎有两种机制

    接下来,我们用原生态模板机制来实现

    1.原生态机制

    该机制主要是执行数据库操作的代码get_data.php单独放到一个文件中,显示的hmtl代码show_page.php放到另一个文件中,然后在html代码show_page.php中包含执行数据库操作的代码get_data.php.代码如下:

    get_data.php
        <?php 
            mysql_connect("localhost","root","") or die("conect failed:".mysql_error());
            mysql_select_db("shop");
            $result = mysql_query("select * from sh_goods");
            $data = array();
            while (mysql_fetch_array($result)) {
                $data[] = $result['good_name'];
            }
            mysql_free_result($result);
            mysql_close();
        ?>
    show_page.php
        <!DOCTYPE html>
        <html>
        <head>
            <title>分离代码</title>
        </head>
        <body>
            商品信息:
            <ul>
                <?php 
                    include 'get_data.php';
                    foreach ($data as $key => $value) {
                ?>
                <li><?php echo $value['good_name']; ?></li>
                <?php } ?>
            </ul>
        </body>
        </html>

    该机制比较简单,符合PHP的语法和使用的习惯,显然比混写代码更容易维护。但是,有时考虑到网站的性能,我们想要缓存代码的时候,这种方法就不能提供支持了。类似的,错误处理,可配置化,脱离php语法等高级功能也不容易实现。

    2.更强大的模板机制

    该机制与上一个机制刚好相反,在负责数据操作的文件中包含模板,模板只负责显示即可,不用考虑php操作。
    本引擎的执行流程如下:
    执行流程

    该模板引擎有以下几部分组成

    1. Cache文件夹: 该文件夹存放编译完成后的文件
    2. Template文件夹: 该文件夹存放模板文件
    3. Template.class.php Template类提供了读取和设置配置的方法,注入变量方法,展示模板的方法。
    4. Compile.class.php Compile类提供了模板解析方法,模板解析方法是通过预先定义好的正则表达式匹配,并替换成相应的PHP代码,同时也添加了PHP原生代码的支持。我们也可以简单地通过添加正则表达式,来扩充变量标签。

    由于代码有点长,所以放在github上,O(∩_∩)O~,代码比较简单,可以加深我们对模板引擎的理解,smarty等更复杂,但基本原理差不多就是这样。
    具体代码链接如下:https://www.github.com/fengyuhetao/Code.git,该目录Template Engine中就是简易的模板引擎代码。

    说明:该源代码是基于《PHP核心技术与最佳实践》一书中的案例,本人只是稍作修改,非原创。文章为原创。
  • 相关阅读:
    快速幂
    快速幂
    快速排序的分治求解方法
    快速排序的分治求解方法
    合并排序的分治求解方法
    合并排序的分治求解方法
    重写ListView解决ListView内部ViewPaper滑动事件冲突问题
    HDU 4970(杭电多校#9 1011题)Killing Monsters(瞎搞)
    Java 反射机制[Field反射]
    【公告】博客数据异常已所有恢复
  • 原文地址:https://www.cnblogs.com/apolloren/p/7819793.html
Copyright © 2020-2023  润新知