投稿说明 bitsCN.com > 编程/数据库 > PHP >
PHP-Web 应用程序开发:使用模板
标签:程序开发
每个进行过较大型的 PHP-Web 应用程序设计的开发人员大概都有如下的经历:花大量的时间写超文本语句,为页面排版,兼作美工等;或在整合的程序代码在和HTML静态页面时花费大量的时间。的确,用脚本语言开发 Web 应用不容易将数据的处理和数据的显示分开,但在多人合作的情况下,如果无法将数据和显示分开,将大大影响开发的效率,专业分工的发挥。为了解决这个问题,PHP 也提供了自己的解决方案,有多种,本文主要介绍 PHPLIB 中的 Template 类。
一、模板处理类的设计
模板处理类主要需完成以下的任务:
- 从模板文件中读取显示用的HTML代码。
- 将模板文件和实际生成的数据结合,生成输出的结果。
- 允许同时处理多个模板。
- 允许模板的嵌套。
- 允许对模板中的某个单独的部分进行处理。
归纳上述任务,模板类的设计目标为:从多个模板文件中读入显示的HTML代码,将这些显示代码中需要动态数据的地方替换为PHP程序运算所得出的数据,然后按照一定的顺序输出。其中,替换的部分可以自由的设定。
读取显示用的HTML代码采用读文件的方式
模板文件和数据的结合采用正则替换
处理多个模板用数组存储来实现。
模板的嵌套的实现主要的想法是:将模板和输出(任何中间的分析结果)一视同仁,都可拿来做替换,即可实现。
单独部分的处理的通过在模板文件中设定标注,然后在正则替换中结合标注来控制,实现部分替换。
二、模板处理类的实现
请参看 PHPLib 中的 Template.inc,总共 345 行代码,有详细的注释。以下列举一些主要的函数,供研读参考:
1) function set_file($handle,$filename=” ”) line 77, 读取文件
2) function set_var($varname, $value = "") line 119, 设置映射数据-替换变量
3) function set_block($parent, $handle, $name = "") line 96, 设置标注
4) function subst($handle) line 136, 执行数据替换
5) function parse($target, $handle, $append = false) line 165, 执行模板文件与数据的结合
6) function p($varname) line 268, 输出处理结果
注:本人下载的php-lib7.2c的Template.inc文件中的第95行少了个“/”,加上后使用正常。
三、模板处理类的使用
3.1 最基本的例子
为了简单起见,这里假设模板文件、使用模板的PHP文件和模板处理类的文件都放在同一个目录下。PHPLIB中的习惯是使用ihtml后缀为模板文件的后缀。
下面是要使用的模板文件:
这是一个使用模板的测试文件!
当前的时间是{currenttime}!
注:模板文件和通常的 HTML 文件差不多,唯一不同的是使用“{}”括起来的是可以被模板处理类替换的动态内容的变量。
接下来使用模板处理类来处理上面的模板:
//引入Template类
include("template.inc");
//得到需要替换的数据
$timeNow=date("Y-m-d H:i:s",time());
//实例化一个Template类
$template= new Template();
//载入test.ihtml模板
$template->set_file("handle1","test.ihtml");
//使用$timeNow的值替换模板中的currenttime
$template->set_var("currenttime",$timeNow);
//进行实际的模板操作
$template->parse("output","handle1");
//输出最后结果
$template->p("output");
?>
注:如果只想用PHPLIB中的模板类,只需在文件头包含Template.inc类即可。 创建Template对象时,可以指定模板文件路径,如:new Template(“/htdocs/apps/templates/”),缺省为当前路径。
3.2 模板嵌套与块设定
下面这个例子来自与PHPLIB的参考手册,综合性较强,这里需说明的一点是设定块的目的与嵌套无关,但这个范例包含了两者。请仔细阅读,块设定是为了避免这种情况:原本可在一个模板文件(静态页面)里完成的内容,因需要部分循环,而将部分循环内容提取单独做成模板文件。请思考,如果不用块设定,这个例子是不是需要3个模板文件呢?
模板文件1,page.ihtml
{PAGETITLE}
{OUT}
Content
模板文件2,box.ihtml
{TITLE}
{NUM}
{BIGNUM}
模板处理文件,test.php
//引入Template类
include("template.inc");
#实例化一个Template类,名字叫$t
$t = new Template();
# 建立包含模板文件的数组
$t->set_file(array(
"page" => "page.ihtml",
"box" => "box.ihtml"));
# 载入模板文件box中的一个块row,引用名称为rows
$t->set_block("box", "row", "rows");
# 设置替换
$t->set_var(array("TITLE" => "Testpage",
"PAGETITLE" => "hugo"));
# 生成数据NUM,BIGNUM
for ($i=1; $i<=3; $i ) {
$n = $i;
$nn = $i*10;
#设置替换
$t->set_var(array("NUM" => $n, "BIGNUM" => $nn));
#进行分析,分析的结果添加到rows的后面
$t->parse("rows", "row", true);
}
# 生成box,再生成page
$t->parse("OUT", array("box", "page"));
# 输出最后结果
$t->p("OUT");
?>
推荐阅读
-
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
-
本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ...
[详细]
-
QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ...
[详细]
-
本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ...
[详细]
-
2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ...
[详细]
-
尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ...
[详细]
-
本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ...
[详细]
-
本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ...
[详细]
-
本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ...
[详细]
-
本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ...
[详细]
-
本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ...
[详细]
-
本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ...
[详细]
-
本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ...
[详细]
-
Tags | 热门标签
RankList | 热门文章
-
1内存泄露解决实战
-
2表里|层面_ShardingJDBC第一篇:分库分表
-
3Java与Python该选择哪个好
-
4离线切片的制作和加载方式
-
5关于myeclipse的破解run.bat一闪而过的问题
-
6laravel怎么关闭csrf验证
-
7【Linux】深度理解进程地址空间
-
8华为nova手机打开开发者模式
-
9css3中rem 与px算法
-
10UE4 打开,加载关卡时传递参数
-
11【区别】最短路amp;amp;amp;最小生成树
-
121.8 Linux中的远程登陆服务
-
13HBase RegionServer详解
-
14NOIP2018 考前注意
-
15无法安装_maya2018无法安装卸载激活失败
每个进行过较大型的 PHP-Web 应用程序设计的开发人员大概都有如下的经历:花大量的时间写超文本语句,为页面排版,兼作美工等;或在整合的程序代码在和HTML静态页面时花费大量的时间。的确,用脚本语言开发 Web 应用不容易将数据的处理和数据的显示分开,但在多人合作的情况下,如果无法将数据和显示分开,将大大影响开发的效率,专业分工的发挥。为了解决这个问题,PHP 也提供了自己的解决方案,有多种,本文主要介绍 PHPLIB 中的 Template 类。
一、模板处理类的设计
模板处理类主要需完成以下的任务:
- 从模板文件中读取显示用的HTML代码。
- 将模板文件和实际生成的数据结合,生成输出的结果。
- 允许同时处理多个模板。
- 允许模板的嵌套。
- 允许对模板中的某个单独的部分进行处理。
归纳上述任务,模板类的设计目标为:从多个模板文件中读入显示的HTML代码,将这些显示代码中需要动态数据的地方替换为PHP程序运算所得出的数据,然后按照一定的顺序输出。其中,替换的部分可以自由的设定。
读取显示用的HTML代码采用读文件的方式
模板文件和数据的结合采用正则替换
处理多个模板用数组存储来实现。
模板的嵌套的实现主要的想法是:将模板和输出(任何中间的分析结果)一视同仁,都可拿来做替换,即可实现。
单独部分的处理的通过在模板文件中设定标注,然后在正则替换中结合标注来控制,实现部分替换。
二、模板处理类的实现
请参看 PHPLib 中的 Template.inc,总共 345 行代码,有详细的注释。以下列举一些主要的函数,供研读参考:
1) function set_file($handle,$filename=” ”) line 77, 读取文件
2) function set_var($varname, $value = "") line 119, 设置映射数据-替换变量
3) function set_block($parent, $handle, $name = "") line 96, 设置标注
4) function subst($handle) line 136, 执行数据替换
5) function parse($target, $handle, $append = false) line 165, 执行模板文件与数据的结合
6) function p($varname) line 268, 输出处理结果
注:本人下载的php-lib7.2c的Template.inc文件中的第95行少了个“/”,加上后使用正常。
三、模板处理类的使用
3.1 最基本的例子
为了简单起见,这里假设模板文件、使用模板的PHP文件和模板处理类的文件都放在同一个目录下。PHPLIB中的习惯是使用ihtml后缀为模板文件的后缀。
下面是要使用的模板文件:
这是一个使用模板的测试文件!
当前的时间是{currenttime}!
注:模板文件和通常的 HTML 文件差不多,唯一不同的是使用“{}”括起来的是可以被模板处理类替换的动态内容的变量。
接下来使用模板处理类来处理上面的模板:
//引入Template类
include("template.inc");
//得到需要替换的数据
$timeNow=date("Y-m-d H:i:s",time());
//实例化一个Template类
$template= new Template();
//载入test.ihtml模板
$template->set_file("handle1","test.ihtml");
//使用$timeNow的值替换模板中的currenttime
$template->set_var("currenttime",$timeNow);
//进行实际的模板操作
$template->parse("output","handle1");
//输出最后结果
$template->p("output");
?>
3.2 模板嵌套与块设定
下面这个例子来自与PHPLIB的参考手册,综合性较强,这里需说明的一点是设定块的目的与嵌套无关,但这个范例包含了两者。请仔细阅读,块设定是为了避免这种情况:原本可在一个模板文件(静态页面)里完成的内容,因需要部分循环,而将部分循环内容提取单独做成模板文件。请思考,如果不用块设定,这个例子是不是需要3个模板文件呢?
模板文件1,page.ihtml
{PAGETITLE} {OUT} Content
模板文件2,box.ihtml
{TITLE} {NUM} {BIGNUM}
模板处理文件,test.php
//引入Template类
include("template.inc");
#实例化一个Template类,名字叫$t
$t = new Template();
# 建立包含模板文件的数组
$t->set_file(array(
"page" => "page.ihtml",
"box" => "box.ihtml"));
# 载入模板文件box中的一个块row,引用名称为rows
$t->set_block("box", "row", "rows");
# 设置替换
$t->set_var(array("TITLE" => "Testpage",
"PAGETITLE" => "hugo"));
# 生成数据NUM,BIGNUM
for ($i=1; $i<=3; $i ) {
$n = $i;
$nn = $i*10;
#设置替换
$t->set_var(array("NUM" => $n, "BIGNUM" => $nn));
#进行分析,分析的结果添加到rows的后面
$t->parse("rows", "row", true);
}
# 生成box,再生成page
$t->parse("OUT", array("box", "page"));
# 输出最后结果
$t->p("OUT");
?>
-
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]Tags | 热门标签RankList | 热门文章
- 1内存泄露解决实战
- 2表里|层面_ShardingJDBC第一篇:分库分表
- 3Java与Python该选择哪个好
- 4离线切片的制作和加载方式
- 5关于myeclipse的破解run.bat一闪而过的问题
- 6laravel怎么关闭csrf验证
- 7【Linux】深度理解进程地址空间
- 8华为nova手机打开开发者模式
- 9css3中rem 与px算法
- 10UE4 打开,加载关卡时传递参数
- 11【区别】最短路amp;amp;amp;最小生成树
- 121.8 Linux中的远程登陆服务
- 13HBase RegionServer详解
- 14NOIP2018 考前注意
- 15无法安装_maya2018无法安装卸载激活失败