代码解释类似smart模版引擎原理
程序员文章站
2022-04-09 20:01:24
...
先贴下目录结构:
ls
compiled/ index.php source/ ss.class.PHP
compiled 模版编辑后的目录
index.php
source 模版源文件夹
ss.clsss.php 山寨类smarty文件夹
ss.clsss.php
templateDir=$templateDir;
$this->compileDir=$compileDir;
if(!empty($leftTag))$this->leftTag=$leftTag;
if(!empty($rightTag))$this->rightTag=$rightTag;
if(!empty($templateExtName))$this->templateExtName=$templateExtName;
}
// 把用到的变量放入到变量池子中
public function assign($tag,$var){
$this->varPool[$tag]=$var;
}
// 取出一条变量,用于下面的str_replace正则替换
public function getVar($tag){
return $this->varPool[$tag];
}
//获取模版源文件
public function getSourceTemplate($templateName){
$this->currentTemp=$templateName;
// 拼接完整文件名
$sourceFileName=$this->templateDir.$this->currentTemp.$this->templateExtName;
$this->outputHtml=file_get_contents($sourceFileName);
}
// 编译
public function compileTemplate($templateName=null){
// 获取当前需要编译的模版
$templateName=empty($templateName)?$this->currentTemp:$templateName;
// $pattern='/\{#(\$[a-zA-Z_]\w+)#\}/';// 符合php变量命名
//preg_quote 可对用户界定的左右定界符中出现. \ + * ? [ ^ ] $ ( ) { } = ! | : -进行转义
$pattern="/".preg_quote($this->leftTag);
//前后加上空格匹配任意次匹配类似{# $name #}
$pattern.=' *\$([a-zA-Z_]\w*) *';
$pattern.=preg_quote($this->rightTag)."/";
$this->outputHtml=preg_replace($pattern, 'getVar(\'$1\');?>', $this->outputHtml);// $1写成\\1也可以
// 注意不要用双引号,会解析getvar Template::$getVar报notice错误
$this->outputHtml=preg_replace($pattern, "getVar(\\1);?>", $this->outputHtml);
$compileFileName=$this->compileDir.md5($templateName).$this->templateExtName;
file_put_contents($compileFileName, $this->outputHtml);
}
// 输出
public function display($templateName=null){
$templateName=empty($templateName)?$this->currentTemp:$templateName;
include($this->compileDir.md5($templateName).$this->templateExtName);
}
}
简单调用如下:(index.php
中内容)
assign('name','iamtb');
$test->assign('pageTitle','tbtbt');
$test->getSourceTemplate('index');
$test->compileTemplate('index');
$test->display('index');
以上就介绍了代码解释类似smart模版引擎原理,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
上一篇: PHP实现的实时搜索提示