登录  /  注册
PHP模板引擎的原理与实践
php中文网
发布: 2016-07-30 13:31:03
原创
715人浏览过

0x00 模板引擎的原理

模板引擎就是在模板文件中使用一系列提前约定好的标签代替原生PHP代码,通过访问一个PHP的入口文件,会有一个PHP编译文件根据约定替换模板内标签以及标签内变量,最终将模板文件编译成一个PHP文件,然后展示到浏览器中。

模板文件

前端开发者将前端代码中的所有数据替换成与服务端开发者约定好的标签及变量名。

PHP入口文件

服务端开发者将前端代码中所需要的变量注入到前端。

PHP编译文件

该文件中是模板引擎中的核心,在这里我们定义了 标签语句 等,通过读取模板文件,使用正则表达式去匹配模板文件中与后台约定好的标签及变量,并将标签及变量替换成PHP代码,最终生成一个前后端结合的PHP文件。

0x01 约定标签

PHP的语法中,包括 if...elseforeach 等语法,以及需要替换的普通变量 $value , PHP原生语句,注释等等。一般情况下,大家习惯使用以下标签

{$value}
// 对应原生echo$value; ?>
登录后复制
{foreach$array}
    {V}
{/foreach}
// 对应原生foreach($arrayas$K => $V) {
    echo$V;
}
?>
登录后复制
{if $data == 'XiaoMing'}I'mXiaoMing;
{elseif $data == 'XiaoHong' }I'mXiaoHong;
{else}
    I'mXiaoLi;
{/if}
// 对应原生
if($data == 'XiaoMing') {
        echo "XiaoMing";
    } else if ($data == 'XiaoHong'){
        echo "XiaoHong";
    } else {
        echo "XiaoLi";
    }
?>
登录后复制

等等,这些大家可以参考 SmartyDiscuz 的标签。

0x02 构造正则表达式匹配标签及变量  正则表达式30分钟入门教程

对于正则表达式,大家可以戳进上面的教程,简单易用。
下面直接给出相关标签的正则表达式。

// 匹配的正则表达式
$this->T_P[] = "#\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}#";    // 匹配普通变量
$this->T_P[] = "#\{foreach \\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}#";     // 匹配{foreach $array}
$this->T_P[] = "#\{\/(foreach|if)\}#";    // 匹配{/foreach} or {/if}// 对应的替换内容
$this->T_R[] = "\$this->value['\\1']; ?>";
$this->T_R[] = "\$this->value['\\1'] as \$K => \$V) { ?>";
$this->T_R[] = "}?>";
登录后复制

0x03 对模板文件进行编译

编译就是对模板文件读取,使用正则表达式对模板标签及变量进行替换,最终将替换后的内容保存在一个PHP文件中即可。

使用的相关函数:

// 读取文件内容
file_get_contents($file)

// 正则替换
preg_replace(pattern, replacement, subject);
?>
登录后复制

0x04 结束并声明

通过这三步,一个简单的模板引擎就已经制作成功了,但是模板引擎的工作原理上面已经说过了,在进行正则匹配替换的过程中,效率极低,PHP自身效率本来就很低,在加上正则匹配,就可想而知了。所以,一般情况下,模板引擎都会有自己的缓存机制,将解析成功的内容保存成一个html文件,并设置缓存有效期,这样可以很大程度上提升效率。

声明

本文是学习《PHP核心技术与最佳实践》列旭松 陈文著 第6章 PHP模板引擎的原理与实践 学习笔记。
感谢作者!

以上就介绍了PHP模板引擎的原理与实践,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 技术文章
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2023 //m.sbmmt.com/ All Rights Reserved | 苏州跃动光标网络科技有限公司 | 苏ICP备2020058653号-1

 | 本站CDN由 数掘科技 提供

登录PHP中文网,和优秀的人一起学习!
全站2000+教程免费学