您的位置:首页 > 编程语言 > PHP开发

php模板引擎的原理与简单实例

2018-03-13 09:14 441 查看
模板引擎其实就是将一个带有自定义标签的字符串,通过相应的规则解析,返回php可以解析的字符串,这其中正则的运用是必不可少的,所以要有一定的正则基础。
总体思想,引入按规则写好的模板,传递给标签解析类(_HtmlTag)进行解析,再把解析好的字符串传递给php进行解析渲染输出
首先定义了一个_HtmlTag类:
 
先解析下render方法
在render方法中对传入的字符串$s,进行相应的替换渲染,用到了extends方法,import方法,''开头的各种过滤方法,后面会一一进行详解.
_extends方法

使用 个方法是为了判断是否有继承相应的模板文件,在子文件中用{extends 模板名},一般只要填写文件名,如index,系统会自动去构造完整的文件路径,一般在上一级目录,这个在realTpl()方法时会有详解
_import 方法

_import 方法是用来对{import 文件名}标签进行解析,默认也是上层目录,会把该文件的内容解析到当前标签位置,同时支持使用:函数名|参数1, 参数2,...的方式进行字符串的回调.这中的display方法后面会有详解
现在来看一个标签函数_loop,将标签{loop $data $k $v}或{loop $data $v}替换,实现模板循环,其中的parseAttr方法接下来将详解
parseAttr方法

该方法用来解析标签 的参数,返回的第一个参数是值形式字符串,第二个是键值数组,如{loop $data $k $v}返回$data $k $v 组成 的字符串和一个空数组,{if $k = $v}则返回空字符串和和数组[$k => $v];
_if 方法

将{if}{/if}标签解析成原生 的php,简单明了,不多解释
_else方法
将{else}解析成原生的php
_elseif方法
将{elseif}解析成原生的php
  

_for 方法
  

_while方法
  

_end方法
通过这个方法对其$this->string进行修改可以对变量进行如下标签定义:
{$val}{$arr[$key]}{$arr['key']}{:val()}{$arr.key}{$arr.$key}
  

_result方法,做最后处理,返回字符串,_end方法在上面已经解释过了
  

下面再来介绍一下几个过滤的方法

_htmlencodeEcho方法

可以用此种形式对变量进行htmlspecialchars式的过滤spspecialchars函数后面会有介绍{:e $val}
  

_htmldecodeEcho方法
  

_defaultEcho方法
  

_xssEcho方法
  
_echo方法
  

_baseParse方法,这个对css和js的引入进行处理
  

_loadJs方法
  
_loadCss方法
  

上面两个函数都用到了各自的parseCss,和parseJs,让我们来看下
  

上面的_html类和他的方法对传入的字符串进行了标签到原生 Php的替换,可以传入相应的模板,也可以在其中自定义自己的过滤方法。
下面我们再来看一个template类:
定义这个类来对模板进行管理,这里会用到上面的_html类,基本定义如下,接下来会介绍其中的一些方法
  
getString方法

在之前 开启ob_start(),然后获取这之间的ob数据,试用于框架中
  

display方法
  

compiles方法, 在这里使用了sp_file_put_contentsb函数会在后面介绍
  

make_magic_func方法
注意

两个类的相应方法都 定义好了,这其中用到的函数sp_file_pu_contents($file, $data)
js压缩类: jsmin.class.php
链接:http://pan.baidu.com/s/1kUBx0X5 密码:y5jb
将这两个 类定义在一个文件中,使用进进行相应的配置
   使用
文件准备
main.htm:
base.htm
im.htm
index.php
运行index.php查看结果



 



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: