深入解析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类
Nov 25 PHP
PHP 提取图片img标记中的任意属性的简单实例
Dec 10 PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
Nov 03 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
PHP数组游标实现对数组的各种操作详解
Jan 26 PHP
Symfony学习十分钟入门经典教程
Feb 03 PHP
php中让人头疼的浮点数运算分析
Oct 10 PHP
PHP接口并发测试的方法(推荐)
Dec 15 PHP
thinkPHP框架中执行事务的方法示例
May 31 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
Aug 26 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
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
php简单实现快速排序的方法
2015/04/04 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
React中this丢失的四种解决方法
2019/03/12 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
python中的yield使用方法
2014/02/11 Python
Python3基础之基本运算符概述
2014/08/13 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
python 连接sqlite及简单操作
2017/06/30 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
2020/11/24 Python
维多利亚的秘密官方旗舰店:VICTORIA’S SECRET
2018/04/02 全球购物
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
前厅部经理岗位职责范文
2014/02/04 职场文书
白酒市场营销方案
2014/02/25 职场文书
公证委托书标准格式
2014/09/11 职场文书
小学优秀班主任材料
2014/12/17 职场文书
党校个人总结
2015/03/04 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android