PHP实现简易的模板引擎
PHP实现简易的模板引擎
1.MVC简介
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度):
1. Model(模型)表示应用程序核心(比如数据库记录列表)。
2. View(视图)显示数据(数据库记录)
3. Controller(控制器)处理输入(写入数据库记录)。
MVC的流程图如下(来源百度百科):
2.本文重点:模板引擎
在视图层,PHP可以采用两种方式编写:
- PHP代码和HTML代码混写,甚至JavaScript等
- 采用模板引擎使得数据和显示分离,这种方式更易于维护。
首先让我们来看一下混写代码:
<!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操作。
本引擎的执行流程如下:
该模板引擎有以下几部分组成
- Cache文件夹: 该文件夹存放编译完成后的文件
- Template文件夹: 该文件夹存放模板文件
- Template.class.php Template类提供了读取和设置配置的方法,注入变量方法,展示模板的方法。
- Compile.class.php Compile类提供了模板解析方法,模板解析方法是通过预先定义好的正则表达式匹配,并替换成相应的PHP代码,同时也添加了PHP原生代码的支持。我们也可以简单地通过添加正则表达式,来扩充变量标签。
由于代码有点长,所以放在github上,O(∩_∩)O~,代码比较简单,可以加深我们对模板引擎的理解,smarty等更复杂,但基本原理差不多就是这样。
具体代码链接如下:https://www.github.com/fengyuhetao/Code.git,该目录Template Engine中就是简易的模板引擎代码。
说明:该源代码是基于《PHP核心技术与最佳实践》一书中的案例,本人只是稍作修改,非原创。文章为原创。
PHP实现简易的模板引擎的更多相关文章
- 简易js模板引擎
前面 js 模板引擎有很多很多,我以前经常用 art-template ,有时候也会拿 vue 来当模板引擎用. 直到...... 年初的时候,我还在上个项目组,那时候代码规范是未经允许不能使用 [外 ...
- JS模板引擎 :ArtTemplate (2)
上一篇初略的介绍了一下javascript中的模板引擎,有兴趣的可以戳 这里 . 这一篇将带着大家一起做一个简易的模板引擎, 上一篇介绍到:模板引擎其实做的就是两件事. 根据一定的规则,解析我们所定义 ...
- 一个简单的PHP模板引擎
PHP早期开发中通常是PHP代码和HTML代码混写,这也使代码中充斥着数据库操作,逻辑处理等.当项目不大时,这样的代码还可以接受,但是随着项目不断扩大,我们就会发现同一个文件中同时存在前端逻辑和后端处 ...
- php 实现简易模板引擎
1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Model(模型)表示应用程序核心 ...
- Mustache.js前端模板引擎源码解读
mustache是一个很轻的前端模板引擎,因为之前接手的项目用了这个模板引擎,自己就也继续用了一会觉得还不错,最近项目相对没那么忙,于是就抽了点时间看了一下这个的源码.源码很少,也就只有六百多行,所以 ...
- JST(JavaScript Trimpath)前端模板引擎简介
JST(JavaScript Trimpath)前端模板引擎简介及应用 今天在做某系统日志列表的时候用到了这个玩意儿.刚开始只是根据别人的例子照葫芦画瓢完成了日志列表及对应详情,晚上有空了才仔细去网上 ...
- pug模板引擎(原jade)
前面的话 为什么要引入pug,pug有什么特别之处呢?有一些嵌套层次较深的页面,可能会出现巢状嵌套,如下图所示 在后期维护和修改时,一不小心少了一个尖括号,或者某个标签的开始和闭合没有对应上,就会导致 ...
- php模板原理PHP模板引擎smarty模板原理浅谈
mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...
- PHP的模板引擎smarty原理浅谈
mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...
随机推荐
- MySQL WorkBench中文教程
在网上找到了一份MySQL WorkBench的教程,点此可以下载Work Bench教程(原文),为了便于学习和交流,请朋友帮忙翻译成了中文,点此可以下载Work Bench教程(中文翻译版). 具 ...
- InetAddress Example program in Java
The InetAddress class has no visible constructors. To create an InetAddress object, you have to use ...
- MongoDB:The Definitive Guide CHAPTER 1 Introduction
MongoDB is a powerful, flexible, and scalable data store. It combines the ability to scale out with ...
- Shell函数参数
在Shell中,调用函数时可以向其传递参数.在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... 带参数的函数示例: #!/bin/bash funWit ...
- The server does not support version 3.1 of the JEE Web module specification.
使用MyEclipse2015打开MyEclipse2014编辑的项目,在服务器Tomcat 7部署时,提示"The server does not support version 3.1 ...
- JAVA命名、注释规范
一.命名规范 1. 项目名全部小写 2. 包名全部小写(除非部分是缩写) 3. 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. 如:public class MyFirstClas ...
- Quartz定时任务学习(五)触发器
顾名思义,Trigger(触发器)的责任就是触发一个 Job 去执行.当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联.Quartz 提供了四种类型 ...
- Java整型与字符串相互转换(转)
1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([S ...
- BZOJ 2754([SCOI2012]喵喵叫的星球-统计序列的后缀阵列中子序列出现次数)
2754: [SCOI2012]喵喵叫的星球 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 805 Solved: 380 [id=2754&qu ...
- oracle1
引言: 数据保存问题? 可使用文件保存和数据库保存. 使用文件保存数据存在几个缺点: 1.文本的安全性问题: 2.文件不利于查询和对数据的管理: 3.文件不利于存放海量数据: 4.文件在程序中控制不方 ...