php模板引擎技术简单实现
用了smarty,tp过后,也想了解了解其模板技术是怎么实现,于是写一个简单的模板类,大致就是读取模板文件->替换模板文件的内容->保存或者静态化
tpl.class.php主要解析
assign 方法实现
<span style="color: #008000"> /*</span><span style="color: #008000">* * 模板赋值操作 * @param mixed $tpl_var 如果是字符串,就作为数组索引,如果是数组,就循环赋值 * @param mixed $tpl_value 当$tpl_var为string时的值,默认为 null </span><span style="color: #008000">*/</span> <span style="color: #0000ff">public</span> function assign($tpl_var,$tpl_value=<span style="color: #0000ff">null</span><span style="color: #000000">){ </span><span style="color: #0000ff">if</span>(is_array($tpl_var) && count($tpl_var) > <span style="color: #800080">0</span><span style="color: #000000">){ </span><span style="color: #0000ff">foreach</span> ($tpl_var <span style="color: #0000ff">as</span> $k =><span style="color: #000000"> $v) { $</span><span style="color: #0000ff">this</span>->tpl_vars[$k] =<span style="color: #000000"> $v; } }elseif($tpl_var){ $</span><span style="color: #0000ff">this</span>->tpl_vars[$tpl_var] =<span style="color: #000000"> $tpl_value; } }</span>
fetch 方法实现
<span style="color: #008000">/*</span><span style="color: #008000">* * 生成编译文件 * @param string $tplFile 模板路径 * @param string $comFile 编译路径 * @return string </span><span style="color: #008000">*/</span> <span style="color: #0000ff">private</span><span style="color: #000000"> function fetch($tplFile,$comFile){ </span><span style="color: #008000">//</span><span style="color: #008000">判断编译文件是否需要重新生成(编译文件是否存在或者模板文件修改时间大于编译文件的修改时间)</span> <span style="color: #0000ff">if</span>(!file_exists($comFile) || filemtime($tplFile) ><span style="color: #000000"> filemtime($comFile)){ </span><span style="color: #008000">//</span><span style="color: #008000">编译,此处也可以使用ob_start()进行静态化</span> $content = $<span style="color: #0000ff">this</span>-><span style="color: #000000">tplReplace(file_get_contents($tplFile)); file_put_contents($comFile, $content); } } </span>
简单编译方法:按照规则进行正则替换
<span style="color: #008000">/*</span><span style="color: #008000">* * 编译文件 * @param string $content 待编译的内容 * @return string </span><span style="color: #008000">*/</span> <div style="color:transparent">本&文来源gaodai^.ma#com搞#代!码网</div><strong>搞gaodaima代码</strong> <span style="color: #0000ff">private</span><span style="color: #000000"> function tplReplace($content){ </span><span style="color: #008000">//</span><span style="color: #008000">转义左右定界符 正则表达式字符</span> $left = preg_quote($<span style="color: #0000ff">this</span>->left_delimiter,<span style="color: #800000">'</span><span style="color: #800000">/</span><span style="color: #800000">'</span><span style="color: #000000">); $right </span>= preg_quote($<span style="color: #0000ff">this</span>->right_delimiter,<span style="color: #800000">'</span><span style="color: #800000">/</span><span style="color: #800000">'</span><span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">简单模拟编译 变量</span> $pattern =<span style="color: #000000"> array( </span><span style="color: #008000">//例如</span><span style="color: #008000">{$test}</span> <span style="color: #800000">'</span><span style="color: #800000">/</span><span style="color: #800000">'</span>.$left.<span style="color: #800000">'</span><span style="color: #800000">\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)</span><span style="color: #800000">'</span>.$right.<span style="color: #800000">'</span><span style="color: #800000">/i</span><span style="color: #800000">'</span><span style="color: #000000"> ); $replace </span>=<span style="color: #000000"> array( </span><span style="color: #800000">'</span><span style="color: #800000"><?php echo $this->tpl_vars[\'${1}\']; ?></span><span style="color: #800000">'</span><span style="color: #000000"> ); </span><span style="color: #008000">//</span><span style="color: #008000">正则处理</span> <span style="color: #0000ff">return</span><span style="color: #000000"> preg_replace($pattern, $replace, $content); }</span>