论PHP模板的简单高效实现

大家都知道PHP是世界上最好的语言,PHP在项目开发中的灵活性是个非常重要的优点,非常适合经常变动的业务逻辑和页面内容,当然都离不开一个好用的模板引擎,市面上最常见的PHP模板引擎是smarty,但是smarty功能十分丰富,有些重量级了.

那有没有更好的模板引擎呢? 先来探讨一下模板引擎的几大特点: 书写简单,执行速度,逻辑表达,方便扩展等.从这几方面看最适合的模板引擎就是PHP本身了,所有的要求都能满足要求,不管是smarty还是其他的模板引擎,在执行速度,逻辑表达,方便扩展的方面都不可能超过PHP本身,因为他们都是PHP实现的.唯一的短板就是书写简单这一方面.

那我们怎么补齐这块短板呢? 其实完全可以自己实现一个模板引擎语法规则,然后配合上一个预编译过程即可,把自定义个的模板引擎语法,编译成原生PHP代码即可,既补足了书写简单的短板,也没有对执行速度,逻辑表达,方便扩展等方面有任何损失.并且编译只需一次,编译一次以后模板页面没有变动,再也不需要第二次处理,配合OPCODE缓存更加强大,更能享受到PHP版本升级带来的性能红利.

那怎么来实现呢? 在PHP页面中使用的最多的就是<?php echo $row["title"]; ?>来输出一个变量内容,写起来键盘敲击次数还是比较多的.完全可以实用模板语法{{$row.title}}代替,从原来的28个字符减少到了14个字符,包括if else foreach include等模板语法,只需要一个正则替换,即可实现一个简单高效的模板引擎.

模板页面

<table>

{{foreach $rows as $i => $row}}

    <tr><td>{{$row["username"]}}</td><td>{{$row["password"]}}</td></tr>

{{endforeach}}

</table>

PHP页面

<table>

<?php foreach ($rows as $i => $row) { ?>

    <tr><td><?php echo $row["username"]; ?></td><td><?php echo $row["password"]; ?></td></tr>

<?php } ?>

</table>

核心代码示意


// 此代码已被精简

$tmpl = preg_replace('/{{if (.+?)}}/',       '<?php if ($1) { ?>',       $tmpl);

$tmpl = preg_replace('/{{else}}/',           '<?php } else { ?>',        $tmpl);

$tmpl = preg_replace('/{{elseif (.+?)}}/',   '<?php } elseif ($1) { ?>', $tmpl);

$tmpl = preg_replace('/{{endif}}/',          '<?php } ?>',               $tmpl);

$tmpl = preg_replace('/{{foreach (.+?)}}/',  '<?php foreach ($1) { ?>',  $tmpl);

$tmpl = preg_replace('/{{endforeach}}/',     '<?php } ?>',               $tmpl);

$tmpl = preg_replace('/{{include (.+?)}}/',  '<?php include $1.php; ?>', $tmpl);

$tmpl = preg_replace('/{{(.+?)}}/',          '<?php echo $1; ?>',        $tmpl);

好了,完美解决模板引擎的简单高效需求,还有什么自己的想法都可以添加进来哦!

上一篇:zblog php通过代码实现首页调用缩略图的方法


下一篇:简单理解正则的捕获组和反向引用