1

非常简单的PHP模板引擎.

Posted by reedboat on Sep 10, 2010 in 编程

各种模板引擎很多,php3时代的phplib,使用简单方便,学习成本也低,但是因为每次执行都需要解析模板,性能存在一定的问题,逐渐被smarty替代。Smarty提供了模板编译,内容缓存。但是太复杂,承担了很多现在不应该由模版引擎承担的职责,使用的时候经常还需要翻看手册,smarty大量的文件载入其实也影响了性能。随着MVC模式的兴起,特别是zend framework的流行,视图和逻辑得到了更好的分离,模板引擎的需求越来越淡化了,越来越多的人开始认为php本身就是一个非常好的模板引擎。

真实的模板编写的过程是这样的,UI制作静态html页面,程序员来将其中的动态内容换成模板标签。所以以前认为通过模板引擎能够达到UI和研发工作的完全分离,互不干扰其实是基本达不到的。所以php做模板引擎没有太大的问题,方便而且灵活,可谓最强大的模板引擎。。

原生的php模板的缺陷在于两点

1。所有的输出标签都要用<?php echo ;?>, 书写太不方便,看起来也不够简洁,毕竟UI和程序员都是有可能修改模板的。

2. 太容易嵌入业务逻辑,有些人在时间紧迫的时候就可能会偷懒将业务逻辑直接写在模板里面。

第一个问题很简单就可以解决, 使用下面的函数即可简单的将<{,}>标签替换成<?php 和?> 并且自动添加echo和;

对于已经是原生的php模板,不需要做任何修改,都可以使用。下面的标签都合法。

(不想使用<{和}>符号的可自行修改下面的正则.)

<?php echo $var;?>
<?php echo strlen($var);?>
<{echo $var}>
<{$var}>
<{$this->var;}>
<{strlen($this->var);}>
<{$array.index}>

<{foreach($this->var as $key => $value):}>
<{endforeach}>
<{if ($a > $b ):}>
<{endif}>

同时为了性能考虑,也做了简单的编译支持。代码只有十几行,很容易修改放入自己的项目中。

<?php
function _include($_filename, array $_vars = null) {
    //这里简单的用global变量,只是为了代码的简洁,
    //实际使用的时候可通过其他方式传入。
    global $compile_dir;
    extract($_vars);
    $objfile = $compile_dir . "/" . md5( $_filename) . ".tpl.php";
    // 如果代码文件有修改,那么重新编译模板
    if ( @filemtime($_filename  ) >= @filemtime( $objfile ) ){
        _compile( $_filename, $objfile );
    }
    include $objfile;
}

function _compile( $_filename, $objfile ){
    $str = file_get_contents($_filename);
    //将数组引用的圆点替换成中括号和双引号
    $str = preg_replace('/<{(\s*\$\w[\w\d]+)\.([\w\d]+)\s*}>/',
            '<{$1["$2"]}>', $str);
    //将变量添加echo
    $str = preg_replace(
           '/<{\s*(?:echo\s*)?(\$[^ \s\(\)\.};]+)\s*;?\s*}>/',
           '<?php echo $1; ?>', $str);
    //替换函数调用,添加echo
    $str = preg_replace(
           '/<{\s*(?:echo\s*?)?([^ \t\r\n\(\)}]+)\(([^\t\r\n\(\)}@]+)\)(?:\s*;)?\s*}>/',
           '<?php echo $1($2); ?>', $str);
    //替换开始结束符号
    $str = str_replace( array( "<{", "}>" ), array( '<?php ', ' ?>'), $str);

    $fp  = fopen($objfile, "w+");
    fwrite($fp, $str);
    fclose($fp);
?>

至于第二点,对于一个团队来说,必须要有一定的规范来约束。可以经常组织一下CodeReview,不遵守规则的童鞋请大家喝可乐哈哈。

Tags: , , ,

Copyright © 2012 苇叶舟 All rights reserved. Theme by Laptop Geek.