一个简单的模板处理

以前我的主页一直使用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($fpfilesize($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;
?>