用PHPLIB提供的模版类(class Template)可以非常方便地制作页面和程序分离的php应用。页面和程序的分离大大增强了代码的可读性和管理的方便性,并使得工作可以划分给美工人员和程序员分别完成,分工十分明确。
灵活使用模版类可以产生各种各样的特殊效果,例如使用嵌套模版可以输出二维的数据表,或者其它具有二维特性的数据。例如输出一个九九乘法表,可以用以下两个文件实现:
nine.tpl文件:
<html>
<head>
<title>九九乘法表</title>
</head>
<body>
<table>
<!-- BEGIN bloRow -->
<tr>
<!-- BEGIN bloCol{row_num} -->
<td>{grid_value}</td>
<!-- END bloCol{row_num} -->
</tr>
<!-- END bloRow -->
</table>
</body>
</html>nine.php文件:
<?php
// 包含PHPLIB的模版类文件
require_once("template.inc");// 创建模版实例并打开模版文件
$objTmplt = new Template();
$objTmplt->set_file("fileNine", "nine.tpl");
// 设置行块(bloRow)
$objTmplt->set_block("fileNine", "bloRow", "row");
// 解析行块,使生成9个列块(bloCol1、bloCol2、……、bloCol9)
for ($i = 1; $i <= 9; $i++) {
$objTmplt->set_var("row_num", $i);
$objTmplt->parse("row", "bloRow", true);
}
// 解析列块
for ($i = 1; $i <= 9; $i++) {
// 注意,生成的9个列块是被解析在row模版变量中,而不是fileNine
$objTmplt->set_block("row", "bloCol".$i, "col".$i);
// 循环对当前行的每一列进行解析
for ($j = 1; $j <= 9; $j++) {
$objTmplt->set_var("grid_value", $i * $j);
$objTmplt->parse("col".$i, "bloCol".$i, true);
}
}
// 文件fileNine中的全部模版变量解析到out并输出结果
$objTmplt->parse("out", "fileNine");
$objTmplt->p("out");
?>
当然这个乘法表太简陋了,但并不妨碍此处说明问题。读者有兴趣可以自己做一个美化加强版。
上面的这种实现方法效率会比较低(当然对于乘法表而言此种效率是足够用了),主要问题出在模版类的set_block方法在第二个for循环中执行了9次,而set_block方法是通过正则表达式匹配寻找块的开头<!-- BEGIN block_name -->和结尾<!-- END block_name -->的,当模版文件比较大时,字符串搜索的时间就已经比较长,更何况要用for循环来进行此种搜索。
优化的方法是把子模版提取出来,单独放到一个模版文件中。不用担心模版文件的I/O读写会增加耗时,因为这个子模版文件只需要读一次。请看程序:
nine.tpl文件:
<html>
<head>
<title>九九乘法表</title>
</head>
<body>
<table>
<!-- BEGIN bloRow -->
<tr>
{cols{row_num}}
</tr>
<!-- END bloRow -->
</table>
</body>
</html>nine_sub.tpl文件:
<td>{grid_value}</td>nine.php文件:
<?php
// 包含PHPLIB的模版类文件
require_once("template.inc");// 创建模版实例并打开模版文件
$objTmplt = new Template();
$objTmplt->set_file("fileNine", "nine.tpl");
// 打开子模版
$objTmplt->set_file("fileSub", "nine_sub.tpl");
// 设置行块(bloRow)
$objTmplt->set_block("fileNine", "bloRow", "row");
// 解析行块,使生成9个列模版变量(cols1、cols2、……、cols9)
for ($i = 1; $i <= 9; $i++) {
$objTmplt->set_var("row_num", $i);
$objTmplt->parse("row", "bloRow", true);
}
// 解析列块
for ($i = 1; $i <= 9; $i++) {
// 此处已经不需要再用set_block来设置块了
// 循环对当前行的每一列进行解析
for ($j = 1; $j <= 9; $j++) {
$objTmplt->set_var("grid_value", $i * $j);
// 注意,解析列语句要改成这样,把子模版文件解析到上面生成的9个列模版变量中
$objTmplt->parse("cols".$i, "fileSub", true);
}
}
// 文件fileNine中的全部模版变量解析到out并输出结果
$objTmplt->parse("out", "fileNine");
$objTmplt->p("out");
?>
当模版文件比较大,模版内容处理比较复杂时,此种优化可以获得相当可观的效率提升。
用户登录





