FastTemplate快在哪里? 但是作为一个大型网站,代码和内容混合在一起的方式似乎不是一个好的风格。我改进了自己的模板类加上了cache即生成静态页面,在指定时间内可以直接从cache文件中输出内容,速度又增加了10倍。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用phplib的template或者 eval()都比FT快很多 把你写的贴出来看看?或者E我: [email protected] 在php最好不要用FastTemplate,这是建议,FastTemplate是perl的产物。 使用Perl写过网页,然后发现PHP/ASP这种HTML中嵌入脚本的方式更好用,所以转用PHP了,但开发了不少网站后发现,还是HTML与代码分开好。把HTML和代码放在一起完全是初学者的玩具,我想PHP原来叫个人网站工具就是这个原因。我现在觉得Perl/ASP/PHP是一样的。PHP的好处是可以作为Server模块运行 我的模板类,只供测试,还加错误处理等flashTemplate.php<?//模板类说明://模板从模板文件中取得//每个模板文件由多个模板块block组成,每个块有一个名字,//<!--TPL START:模板名-->标志块的开始//<!--TPL END:模板名-->标志块的结束//整个文件可以看成一个块,名字为_MainBlock,因此其它块不能取此名字//整个文件内容用LoadFile方法取出,支持从多个文件中取出模板,因此必须给每个文件取一个文件句柄//该句柄必须在以后的每个方法中传入,表示对该模板文件进行处理,不给名字则默认句柄名为模板文件名//$foo->LoadFile(array(句柄名=>"模板文件名"))//块可以嵌套,但处理时必须从里向外取出,使用方法LoadBlock//$foo->LoadBlock(句柄名,块名)//之后可以对模板处理,先将实际内容与模板中的待替代变量用Assign方法指定//$foo->Assign(句柄名,array(模板变量名=>实际内容),块名)//不指定块名则针对对整个文件内容//再调用Parse方法进行替代处理//$foo->Parse(句柄名,块名)//不指定块名则针对对整个文件内容处理//处理完成后使用GetResult方法取得结果//ParseAppend将本次处理的结果追加到上一次处理的结果上,一般用于表格内行的循环//在块的嵌套中,内层处理完成后可使用AssignBlock方法把内层的结果指定到外层模板的待替代变量上//PrintResult方法输出结果,在最外层处理完成后。class FlashTemplate { var $tpgs=array(); var $tpls=array(); var $results=array(); var $tplvars=array(); function LoadFile($TpgName){ if(is_array($TpgName)){ while ( list ( $key , $val ) = each ( $TpgName ) ){ $this->tpgs["$key"]=implode("",file($val)); } }else $this->tpgs["$TpgName"]=implode("",file($TpgName)); } function LoadBlock($TpgName,$tplname=""){ if($tplname=="_MainBlock") die( 'Template block name "_MainBlock" is reserved by FlashTemplate.'); if($tplname!=""){ $search="/<!--TPL START:".$tplname."-->(.*?)<!--TPL END:".$tplname."-->/is"; if(preg_match($search,$this->tpgs["$TpgName"],$matches)){ $this->tpls["$TpgName"]["$tplname"]= $matches[1]; $this->tplvars["$TpgName"]["{$tplname}_mrk"]=array(); $this->tplvars["$TpgName"]["{$tplname}_var"]=array(); $this->tpgs["$TpgName"]=str_replace(&$matches[0],"{{$tplname}}",&$this->tpgs["$TpgName"]); } } } function Assign($TpgName,$mrkvar,$tplname="") { if(!is_array($mrkvar)) return; if(!$tplname) $tplname="_MainBlock"; while ( list ($key,$val) = each ($mrkvar) ){ $this->tplvars["$TpgName"]["{$tplname}_mrk"]["$key"]="{{$key}}"; $this->tplvars["$TpgName"]["{$tplname}_var"]["$key"]="$val"; } } function Assign1($TpgName,$mrk,$var,$tplname=""){ if(!$tplname) $tplname="_MainBlock"; $this->tplvars["$TpgName"]["{$tplname}_mrk"]["$mrk"]="{{$mrk}}"; $this->tplvars["$TpgName"]["{$tplname}_var"]["$mrk"]="$var"; } function AssignBlock($TpgName,$tplname,$Parenttpl=""){ if(!$Parenttpl) $Parenttpl="_MainBlock"; $this->tplvars["$TpgName"]["{$Parenttpl}_mrk"]["$mrk"]="{{$tplname}}"; $this->tplvars["$TpgName"]["{$Parenttpl}_var"]["$mrk"]=$this->GetResult(&$TpgName,&$tplname); } function AssignFBlock($TpgName,$tplname,$TpgName1,$Parenttpl=""){ if(!$Parenttpl) $Parenttpl="_MainBlock"; $this->tplvars["$TpgName1"]["{$Parenttpl}_mrk"]["$mrk"]="{{$tplname}}"; $this->tplvars["$TpgName1"]["{$Parenttpl}_var"]["$mrk"]=$this->GetResult(&$TpgName,&$tplname); } function GetResult($TpgName,$tplname=""){ if(!$tplname) $tplname="_MainBlock"; return $this->results["$TpgName"]["$tplname"]; } function ClearResult($TpgName,$tplname=""){ if(!$tplname) $tplname="_MainBlock"; $this->results["$TpgName"]["$tplname"]=""; } function PrintResult($TpgName,$tplname=""){ if(!$tplname) $tplname="_MainBlock"; echo $this->results["$TpgName"]["$tplname"]; } function Parse($TpgName,$tplname=""){ if(!$tplname) $this->results["$TpgName"]["_MainBlock"]=str_replace(&$this->tplvars["$TpgName"]["_MainBlock_mrk"],&$this->tplvars["$TpgName"]["_MainBlock_var"],&$this->tpgs["$TpgName"]); else $this->results["$TpgName"]["$tplname"]=str_replace(&$this->tplvars["$TpgName"]["{$tplname}_mrk"],&$this->tplvars["$TpgName"]["${tplname}_var"],&$this->tpls["$TpgName"]["$tplname"]); } function ParseAppend($TpgName,$tplname=""){ if(!$tplname) $this->results["$TpgName"]["_MainBlock"].=str_replace(&$this->tplvars["$TpgName"]["{_MainBlock_mrk"],&$this->tplvars["$TpgName"]["_MainBlock_var"],&$this->tpgs["$TpgName"]); else $this->results["$TpgName"]["$tplname"].=str_replace(&$this->tplvars["$TpgName"]["{$tplname}_mrk"],&$this->tplvars["$TpgName"]["{$tplname}_var"],&$this->tpls["$TpgName"]["$tplname"]); }}?>范例:模板格式:test.tpl,有两层嵌套<html><head><title> {MyTitle} </title></head><body><!--TPL START:MYPAGE--><b>{A1} {A2}</b><br>_____________________________________________________________________<br> <!--TPL START:MYCONTENT--> {N1} {N2}<br> <!--TPL End:MYCONTENT-->_____________________________________________________________________<br><!--TPL End:MYPAGE-->{MyFooter} </body></html>测试文件:test.php<?include("FlashTemplate.php");$t=new FlashTemplate();$t->LoadFile(array(TEST=>"./Test.tpl"));//取出模板内容$t->LoadBlock("TEST","MYCONTENT");//取出最内层的块$t->LoadBlock("TEST","MYPAGE");//取出外层的块for($j=1;$j<=10;$j++){//处理外层模板块 for($i=1;$i<=10;$i++){//处理内层模板块 $t->Assign("TEST",array(N1=>($j*100+$i), N2=>($j*100+$i)*10 ) ,"MYCONTENT"); $t->ParseAppend("TEST","MYCONTENT"); } $t->AssignBlock("TEST","MYCONTENT","MYPAGE");//将内层块处理结果指定给外层的一个模板变量 $t->Assign("TEST",array(A1=>$j, A2=>$j*10 ), "MYPAGE"); $t->ParseAppend("TEST","MYPAGE"); $t->ClearResult("TEST","MYCONTENT");//进行下一次内层循环前清空内层结果}$t->AssignBlock("TEST","MYPAGE");//将外层结果指定到整个文件块的模板变量$t->Assign("TEST",array(MyTitle =>"这是我的标题", MyFooter=>"这是我的脚注"));$t->Parse("TEST");//处理整个文件块$t->PrintResult("TEST");//输出整个文件块的结果?> jpgraph cache问题,错误提示25113 apache伪静态规则配置问题带?为什么会404 PHP生成海量 二级域名问题 请问mongodb数据库怎么查询出某一段时间内的数据,急 这是怎么回事?????? 如何实现别人在博客上播放我网站音乐时,同时打开我网站? 帮帮忙 解释下fsockopen函数 PHP中的MD5的密钥问题 Apache2.0.35 PHP4.20標版模塊編譯釋出!徵集測試!!! PHP字符串转换 浏览图片要刷新? 从两点看PHP/ASP/JSP的区别
我现在觉得Perl/ASP/PHP是一样的。PHP的好处是可以作为Server模块运行
<?
//模板类说明:
//模板从模板文件中取得
//每个模板文件由多个模板块block组成,每个块有一个名字,
//<!--TPL START:模板名-->标志块的开始
//<!--TPL END:模板名-->标志块的结束
//整个文件可以看成一个块,名字为_MainBlock,因此其它块不能取此名字
//整个文件内容用LoadFile方法取出,支持从多个文件中取出模板,因此必须给每个文件取一个文件句柄
//该句柄必须在以后的每个方法中传入,表示对该模板文件进行处理,不给名字则默认句柄名为模板文件名
//$foo->LoadFile(array(句柄名=>"模板文件名"))
//块可以嵌套,但处理时必须从里向外取出,使用方法LoadBlock
//$foo->LoadBlock(句柄名,块名)
//之后可以对模板处理,先将实际内容与模板中的待替代变量用Assign方法指定
//$foo->Assign(句柄名,array(模板变量名=>实际内容),块名)
//不指定块名则针对对整个文件内容
//再调用Parse方法进行替代处理
//$foo->Parse(句柄名,块名)
//不指定块名则针对对整个文件内容处理
//处理完成后使用GetResult方法取得结果
//ParseAppend将本次处理的结果追加到上一次处理的结果上,一般用于表格内行的循环
//在块的嵌套中,内层处理完成后可使用AssignBlock方法把内层的结果指定到外层模板的待替代变量上
//PrintResult方法输出结果,在最外层处理完成后。
class FlashTemplate {
var $tpgs=array();
var $tpls=array();
var $results=array();
var $tplvars=array();
function LoadFile($TpgName){
if(is_array($TpgName)){
while ( list ( $key , $val ) = each ( $TpgName ) ){
$this->tpgs["$key"]=implode("",file($val));
}
}else
$this->tpgs["$TpgName"]=implode("",file($TpgName));
}
function LoadBlock($TpgName,$tplname=""){
if($tplname=="_MainBlock")
die( 'Template block name "_MainBlock" is reserved by FlashTemplate.');
if($tplname!=""){
$search="/<!--TPL START:".$tplname."-->(.*?)<!--TPL END:".$tplname."-->/is";
if(preg_match($search,$this->tpgs["$TpgName"],$matches)){
$this->tpls["$TpgName"]["$tplname"]= $matches[1];
$this->tplvars["$TpgName"]["{$tplname}_mrk"]=array();
$this->tplvars["$TpgName"]["{$tplname}_var"]=array();
$this->tpgs["$TpgName"]=str_replace(&$matches[0],"{{$tplname}}",&$this->tpgs["$TpgName"]);
}
}
}
function Assign($TpgName,$mrkvar,$tplname="")
{
if(!is_array($mrkvar))
return;
if(!$tplname)
$tplname="_MainBlock";
while ( list ($key,$val) = each ($mrkvar) ){
$this->tplvars["$TpgName"]["{$tplname}_mrk"]["$key"]="{{$key}}";
$this->tplvars["$TpgName"]["{$tplname}_var"]["$key"]="$val";
}
}
function Assign1($TpgName,$mrk,$var,$tplname=""){
if(!$tplname)
$tplname="_MainBlock";
$this->tplvars["$TpgName"]["{$tplname}_mrk"]["$mrk"]="{{$mrk}}";
$this->tplvars["$TpgName"]["{$tplname}_var"]["$mrk"]="$var";
}
function AssignBlock($TpgName,$tplname,$Parenttpl=""){
if(!$Parenttpl)
$Parenttpl="_MainBlock";
$this->tplvars["$TpgName"]["{$Parenttpl}_mrk"]["$mrk"]="{{$tplname}}";
$this->tplvars["$TpgName"]["{$Parenttpl}_var"]["$mrk"]=$this->GetResult(&$TpgName,&$tplname);
}
function AssignFBlock($TpgName,$tplname,$TpgName1,$Parenttpl=""){
if(!$Parenttpl)
$Parenttpl="_MainBlock";
$this->tplvars["$TpgName1"]["{$Parenttpl}_mrk"]["$mrk"]="{{$tplname}}";
$this->tplvars["$TpgName1"]["{$Parenttpl}_var"]["$mrk"]=$this->GetResult(&$TpgName,&$tplname);
}
function GetResult($TpgName,$tplname=""){
if(!$tplname)
$tplname="_MainBlock";
return $this->results["$TpgName"]["$tplname"];
}
function ClearResult($TpgName,$tplname=""){
if(!$tplname)
$tplname="_MainBlock";
$this->results["$TpgName"]["$tplname"]="";
}
function PrintResult($TpgName,$tplname=""){
if(!$tplname)
$tplname="_MainBlock";
echo $this->results["$TpgName"]["$tplname"];
}
function Parse($TpgName,$tplname=""){
if(!$tplname)
$this->results["$TpgName"]["_MainBlock"]=str_replace(&$this->tplvars["$TpgName"]["_MainBlock_mrk"],&$this->tplvars["$TpgName"]["_MainBlock_var"],&$this->tpgs["$TpgName"]);
else
$this->results["$TpgName"]["$tplname"]=str_replace(&$this->tplvars["$TpgName"]["{$tplname}_mrk"],&$this->tplvars["$TpgName"]["${tplname}_var"],&$this->tpls["$TpgName"]["$tplname"]);
}
function ParseAppend($TpgName,$tplname=""){
if(!$tplname)
$this->results["$TpgName"]["_MainBlock"].=str_replace(&$this->tplvars["$TpgName"]["{_MainBlock_mrk"],&$this->tplvars["$TpgName"]["_MainBlock_var"],&$this->tpgs["$TpgName"]);
else
$this->results["$TpgName"]["$tplname"].=str_replace(&$this->tplvars["$TpgName"]["{$tplname}_mrk"],&$this->tplvars["$TpgName"]["{$tplname}_var"],&$this->tpls["$TpgName"]["$tplname"]);
}
}
?>范例:
模板格式:test.tpl,有两层嵌套
<html>
<head><title> {MyTitle} </title>
</head>
<body>
<!--TPL START:MYPAGE-->
<b>{A1} {A2}</b><br>
_____________________________________________________________________<br>
<!--TPL START:MYCONTENT-->
{N1} {N2}<br>
<!--TPL End:MYCONTENT-->
_____________________________________________________________________<br>
<!--TPL End:MYPAGE-->
{MyFooter}
</body>
</html>测试文件:test.php
<?
include("FlashTemplate.php");
$t=new FlashTemplate();
$t->LoadFile(array(TEST=>"./Test.tpl"));//取出模板内容
$t->LoadBlock("TEST","MYCONTENT");//取出最内层的块
$t->LoadBlock("TEST","MYPAGE");//取出外层的块
for($j=1;$j<=10;$j++){//处理外层模板块
for($i=1;$i<=10;$i++){//处理内层模板块
$t->Assign("TEST",array(N1=>($j*100+$i),
N2=>($j*100+$i)*10 )
,"MYCONTENT");
$t->ParseAppend("TEST","MYCONTENT");
}
$t->AssignBlock("TEST","MYCONTENT","MYPAGE");//将内层块处理结果指定给外层的一个模板变量
$t->Assign("TEST",array(A1=>$j,
A2=>$j*10 ),
"MYPAGE");
$t->ParseAppend("TEST","MYPAGE");
$t->ClearResult("TEST","MYCONTENT");//进行下一次内层循环前清空内层结果
}
$t->AssignBlock("TEST","MYPAGE");//将外层结果指定到整个文件块的模板变量
$t->Assign("TEST",array(MyTitle =>"这是我的标题",
MyFooter=>"这是我的脚注"));
$t->Parse("TEST");//处理整个文件块
$t->PrintResult("TEST");//输出整个文件块的结果
?>