以前我的主页一直使用PHPLib中的template类来处理页面显示的,而且使用这个模板类也很简单,处理的结果也可以作为一个字符串来处理。但是这个方法并不是最简单的,最近我又根据eval()函数作出了更简单的模板处理的方式,希望对大家有帮助。不过这个方法处理不是很完美,但足够用了。
eval函数
eval()是一个很有用的函数,它可以将传入的字符串当作一条指令来进行解释处理。那么应该如何写这个串呢?可以这样考虑,一条指令,用双引号或单引号括起来。注意,语句后面的;号不能少。如想要执行:
$a="abc";
则处理为:
$str=’$a="abc";’;
eval($str);
所以我们可以考虑在模板文件中使用变量形式,然后通过使用eval()函数,用真正的值对变量进行替换。在处理的同时,将结果赋给一个变量。
模板处理
假设模板如下:
<html>
<head>
<title>$title</title>
</head>
<body bgcolor="#FFFFFF">
$body
</body>
</html>
在模板中我们定义了$title(标题)和$body(文件体)两个变量。
用eval()函数处理如下:
<?
$title="test";
$body="<h2>Hello, world!</h2>";
$templatefile="tmp.ihtml";
//得到模板文件内容
function getfilecontent($filename)
{
$fp=fopen($filename, "r");
$buf=fread($fp, filesize($filename));
return addslashes($buf);
}
if(file_exists($templatefile) || die("找不到模板文件 $templatefile"))
{
eval(’$content="’.getfilecontent($templatefile).’";’);
}
?>
这样处理完毕后,结果存放在$content变量中。其中有几点要注意:
1) 使用了全局变量$templatefile和$content。原本想将其封装为一个函数,但是由于在函数中的变量如果不特别声明,均为局部变量。所以如果想使用的话需要对变量进行处理。但是由于模板是变化的,不好写成通用的了。所以就使用了全局变量。因此在使用时,应该先给$templatefile赋值。处理完后,可以使用$content来接收处理结果。
2) 使用addslashes()函数对模板字符串进行处理。即在特殊字符前加入转义符(’\’),如对于字符串"aaa",使用这个函数后,变成\"aaa\"。为什么要进行这样的处理呢?是因为,eval()在处理时,处理的是指令的字符串形式。所以要把模板字符串再转换成字符串,再在两头加上双引号(’"’)即可。对于一般字符,转换不变。对于特殊字符,如双引号,$符等,如果想变成字符串,则需引入转义字符。如\"和\$形式。所以addslashes()就起作用了。(也不知道说没说清楚)。举个例子:$a="abc";这条指令要转成字符串形式,应该是"\$a=\"abc\";"。
3) eval(’$content="’.getfilecontent($templatefile).’";’);在处理成功后,应该对变量进行了替换,同时将处理结果赋给$content。
结论
为了使其更加通用,大家可以将上例的前三行删除,将剩下的存成一个文件,以后引入这个文件即可。但使用时,应先对模板中的变量赋值。而且要给$templatefile变量赋值,处理完后使用$content。
调用例子如下:
<?
$title="test";
$body="<h2>Hello, world!</h2>";
$templatefile="tmp.ihtml";
include "template.inc.php3"; //即处理后的文件
echo $content;
?>
|