资讯专栏INFORMATION COLUMN

PHP模板引擎的原理与实践

elina / 2809人阅读

摘要:模板文件前端开发者将前端代码中的所有数据替换成与服务端开发者约定好的标签及变量名。声明本文是学习核心技术与最佳实践列旭松陈文著第章模板引擎的原理与实践学习笔记。

0x00 模板引擎的原理

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

模板文件

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

PHP入口文件

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

PHP编译文件

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

0x01 约定标签

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

{$value}
// 对应原生
{foreach $array}
    {V}
{/foreach}
// 对应原生
 $V) {
    echo $V;
}
?>
{if $data == "XiaoMing"}
    I"m XiaoMing;
{else if $data == "XiaoHong" }
    I"m XiaoHong;
{else}
    I"m XiaoLi;
{/if}
// 对应原生

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

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[] = "value["1"]; ?>";
$this->T_R[] = "value["1"] as $K => $V) { ?>";
$this->T_R[] = "";
0x03 对模板文件进行编译

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

使用的相关函数:

0x04 结束并声明

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

声明

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

原创文章,转载时必须以超链接的形式注明作者和原始出处。 | 作者 : 我才是二亮

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21081.html

相关文章

  • PHP小知识点

    摘要:那些琐碎的知识点作者记录的的很奇特很难记的知识点。易错知识点整理注意和的区别中和都是输出的作用,但是两者之间还是有细微的差别。今天手头不忙,总结一下,分享过程中掌握的知识点。 深入理解 PHP 之:Nginx 与 FPM 的工作机制 这篇文章从 Nginx 与 FPM 的工作机制出发,探讨配置背后的原理,让我们真正理解 Nginx 与 PHP 是如何协同工作的。 PHP 那些琐碎的知识...

    hover_lew 评论0 收藏0
  • Laravel 模板引擎(Blade)原理简析

    摘要:上次提到过,模板引擎一般是要做三件事情变量值的输出条件判断和循环引入或继承其他文件现在就来看看的模板引擎是如何来处理这三件事情的。引擎接下来就是本文的重点是如何编译的。如果有兴趣的话,也可以实现一个自己的模板解析引擎。 上次提到过,模板引擎一般是要做三件事情: 变量值的输出(echo) 条件判断和循环(if ... else、for、foreach、while) 引入或继承其他文件 ...

    vvpvvp 评论0 收藏0
  • PHP模板引擎

    摘要:程序如果没有被和包起来,就会直接输出。当一个文件被包含时,语法解析器在目标文件的开头脱离模式并进入模式,到文件结尾处恢复。由于此原因,目标文件中需要作为代码执行的任何代码都必须被包括在有效的起始和结束标记之中。 PHP模板引擎的由来 为了解决当时混合开发WEB应用出现的一系列问题:代码难维护,代码不可重用,程序员要求知识广等问题 实现后端与前端不完全分离,开发与美工可以分工合作,提高...

    eechen 评论0 收藏0
  • 前端模板原理实现

    摘要:套页面的过程实际就是将静态页面变成切割成一块块,每一块都是一个,或文件,它们是后端模板引擎的处理对象其实模板是不局限于后端还是前端的,模板的本质是用于从数据变量到实际的视觉表现代码这项工作的一种实现手段。 时下流行什么react, avalon, angular, vue什么,其核心都离不开前端模板。理解前端模板,是我们了解MV* 的关键。 前端框架最重要的目的是将页面渲染出来。渲染...

    galois 评论0 收藏0
  • PHPer 面试指南-扩展阅读资源整理

    摘要:前端篇收集的前端面试题和答案前端开发面试题史上最全的前端面试题汇总及答案前端工程师手册协议工作原理协议运行机制的概述协议篇原理原理解析的工作原理与的区别理解后端篇年的面试总结垃圾回收机制面向对象设计浅谈说清楚是什么和的区别索引原理及慢查 前端篇 收集的前端面试题和答案 前端开发面试题 史上最全的web前端面试题汇总及答案 前端工程师手册 HTTP协议:工作原理 SSL/TLS协议运行...

    wemall 评论0 收藏0

发表评论

0条评论

elina

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<