深入解析php模板技术原理【一】


Posted in PHP onJanuary 10, 2008

1、模板的由来
在没有模板技术之前,使用PHP开发程序,通常都是php代码和html混编在一起。比如说新闻列表,很可能就是一个newslist.php页面,结构如下:

<? 
//从数据库中读取出要显示的新闻记录 
?> 
<html> 
<head>…….. 
</head> 
<body> 
<? 
 While ($news = mysql_fetch_array($result)) { 
?> 
<!--输出新闻标题  -- > 
<? 
 } 
?> 
</body> 
</html> 

那么这样有什么问题呢?首先,不利于分工合作。一般来说,都会由程序员来写代码,美工人员设计页面。那么在这种方式中,程序员必须等待美工人员把界面设计好才能开始工作。也就是说程序员和美工的工作是不能同步的。其次、不利于维护,可维护性差。比如说程序固定后,要修改界面,那么必须由美工修改后,程序员再重新添加。最后,程序结构混乱,可读性差。HTML和PHP混编在一起,一旦程序一多,就会变的非常的凌乱。

理解模板原理——使用PHP标签的模板技术
模板技术正是为了解决这些问题而出现的,为了解决这些问题,最早出现的是使用php标签的模板技术。
首先,我们要明白模板的目的是什么。模板主要要实现几个任务呢?第一、美工和程序的分离。更确切的说法是获取数据和显示数据的分离。第二、分工。良好的分工合作。
比如说新闻列表,如果使用模板,我们就可以把新闻列表的操作分成两部分:
1、  getnews.php 负责从数据库中读取数据到数组$news中,不关心$news是如何显示的。
2、  Shownews.php 负责把$news数组输出成HTML页面。而它不需要理会$news是从哪里来的。
好,这样,我们就实现了美工和程序的分离,达到了我们的初步目的,但是如何把这两个页面联合起来,并实现listnews.php的功能呢?
这就需要另外一个页面listnews.php,来负责把“美工(显示数据)”和“程序员(获取数据)”连接起来。应该说这个页面就是很简单了。
假设getnews.php的代码如下:
<? 
$news =“新闻列表”;//实际中应该是从数据库中读取出来的。 
?> 

Shownesw.php的代码如下:
<html> 
<head> 
<title>显示新闻</title> 
</head> 
<body> 
<?=$news?> 
</body> 
</html> 

那么,这个联合页面listnews.php的代码就很简单了
<? 
Include(‘getnews.php');//获取数据 
Include(‘shownesw.php');//显示数据 
?> 

总结
使用PHP标签的模板系统,能够很好的实现美工和程序的分离,同时方便程序员和美工人员的分工合作,比如在上面的例子中shownews.php由美工人员来维护,getnews.php由程序人员来维护。而listnews.php就可以由系统设计人员来维护了。当然这中间需要增加一些约定的文档。
事实上,这个简单的例子也说明了最基本的MVC模型。其中M,模型,也就是负责读取数据,相当于我们的getnews.php。V,就是试图,用来显示数据,也就对应了shownews.php。最后是控制器C,对应我们的listnews.php

学习解释性模板技术——PHPLIB
Phplib的模板系统以小巧灵活、方便简单的特点赢得了很多phper的喜欢,在模板技术中占有一定的地位,它和fasttemplate之类的模板引擎都属于解释性模板技术。
在具体讲解phplib的使用之前,先说明为什么使用php标签的模板系统要继续改进。其实,这主要还是因为PHP标签对美工人员来说不方便。他们更加喜欢直接使用这种可视化的标签,比如{title}。
首先,我们自己把之前我们那个例子修改成使用可视化的标签来处理。第一步,把shownews.php改成shownews.tpl,里面的php标签换成可视化的标签,shownews.tpl的代码如下:
<html> 
<head> 
<title>显示新闻</title> 
</head> 
<body> 
{title} 
</body> 
</html> 
第二步,如何实现listnews.php的效果呢?其实很简单,我只要直接把{title}替换成不就可以了吗?所以,修改后的listnews.php的代码如下:
<? 
Include('getnews.php');//获取数据 
echo str_replace('{title}',$news,file_get_contents('shownews.tpl')) 
?> 

其实phplib的原理正是这样!比如说我们要使用phplib来实现上面功能,我们只需要修改listnews.php.修改后代码如下:
<? 
Include('getnews.php');//获取数据 
include('template.class.php'); 
$t=new Template(); 
$t->set_file(‘shownesw,'shownews.tpl'); 
$t->set_var('news',$news); 
$t->parse('out', ‘shownesw'); 
$t->p('out'); 
?> 
另外关于phplib的区域,大家可以去查阅相应的手册。

编译型的samrty,下次继续讲

PHP 相关文章推荐
PHP 在线翻译函数代码
May 07 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
Sep 26 PHP
windows7下php开发环境搭建图文教程
Jan 06 PHP
PHP的Socket通信之UDP通信实例
Jul 02 PHP
UTF-8正则表达式如何匹配汉字
Aug 03 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
php生成0~1随机小数的方法(必看)
Apr 05 PHP
yii2多图上传组件的使用教程
May 10 PHP
PHP常量define和const的区别详解
May 18 PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 PHP
PHP7变量处理机制修改
Mar 09 PHP
php下MYSQL limit的优化
Jan 10 #PHP
优化使用mysql存储session的php代码
Jan 10 #PHP
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 #PHP
PHP读取目录下所有文件的代码
Jan 07 #PHP
台湾中原大学php教程孙仲岳主讲
Jan 07 #PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 #PHP
php下过滤HTML代码的函数
Dec 10 #PHP
You might like
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
apache mysql php 源码编译使用方法
2012/05/03 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
js鼠标滑过图片震动特效的方法
2015/02/17 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
10款最好的Web开发的 Python 框架
2015/03/18 Python
在Django的通用视图中处理Context的方法
2015/07/21 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
朴素贝叶斯Python实例及解析
2018/11/19 Python
Python3简单实现串口通信的方法
2019/06/12 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
公司授权委托书
2014/04/04 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
医院搬迁方案
2014/06/14 职场文书
艺术节开幕词
2015/01/28 职场文书
土建技术员岗位职责
2015/04/11 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
物资采购管理制度
2015/08/06 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书