admin 管理员组

文章数量: 1184232


2024年4月29日发(作者:words怎么读)

<.<<r0 曼 坠 ! 呈 缠塞堕 

PHP编译型模板的设计与实现 

◆徐杰 

摘要:本文从php模板的原理出发,介绍了编译型模板的特点,并用笔者的 

实践详细描述了编译型模板的实现细节,主要介绍了www.phparticle.net中使用 

的PHPArticle所采用的自主设计的高效编译型模板,ikphp ̄序效率能够发挥到最 

好,提高服务器的利用率, ̄:php的开发者能够从中受到一些启发和帮助。 

关键词:php;phpSg,- ̄;MVC;编译型模板 

模板设计的关键 

为什么是编译型模板?什么叫编译型模板?现在 

国外有个Smarty模板,他就是编译型模板。但是由于其 

现在的大多数模板的设计都还是主要停留在界面设 

计与程序设计相分离上,使界面设计与程序设计可以分 

工同步进行,提高了开发的效率。模板从最初设计到现 

功能非常强大,使用起来比较复杂,对于初学者比较难 

掌握。就是由于它的编译型这个特点,使一部分人对他 

的情有独钟。那为什么选择编译型呢?答案就是,编译 

型能够提高程序运行效率。大家都知道什么是编译,例 

如c语言写的程序,最后要编译成二进制机器码,让计 

算机能够“阅读”并执行。或许你会问,PHP是脚本语 

言,是解析执行的,哪来的编译啊?其实我们说的编 

译,是从广义上来说的编译。C语言到机器码是编译, 

模板代码到PHP执行代码的转换,这个过程,是不是也 

在,其主要目的还是实现界面设计与程序设计相分离。 

个很常用的PHP工具类——PHPLIB,它里面就带了 

个模板类,简单易用,一直都是PHP开发者选择的对 

但是有些模板引擎,为了实现把两者完全独立开 

象。 

来,希望美工能够完全独立的设计模板,而不需要程序 

员的参与,追求更大的灵活性,却最终把模板的解析变 

得越来越复杂了,使美工设计模板的工作远远大于只做 

html设计的工作。很明显,这是得不偿失的。MVC设计 

可以用编译来描述呢?单从模板来说,减少对模板中标 

签的解析,甚至去掉所有解析,代码的运行效率就会提 

高。所以,我们可以把模板中需要解析成PHP代码的地 

方,直接转换成PHP代码,这就是编译,把模板翻译成 

最终的PHP执行代码。 

模式的Struts,其功能很强大,但是我接触了之后,觉 

得要使模板完全脱离程序,特别是复杂一点的程序,还 

是比较困难。而且,Struts的使用方法,体现设计者的 

思路,在没有程序员参与的模板设计里面,模板就只能 

够是一些纯的html代码,因为只有美工知道了程序员的 

思路后,才知道里面的Struts标签应该如何使用。 

实现这一转换很简单,就是把需要解析的地方,用 

对应的PHP替换掉,然后把替换后的模板保存为PHP文 

件。 

界面设计和程序设计相分离,所以我把模板引擎分 

为两个部分:一个是html模板部分,以.htm为后缀;一 

个是程序部分,以.import为后缀。模板中设计了6种标 

签,3种模块表示法和一种变量一种常量表示。 

从上面的分析可以看出,过多的追求模板中使用 

的标签的多样、功能强大,并没有很明显的减轻开发和 

设计的工作量,更没有提高程序的运行效率。我个人认 

为,简单易用、够用,使程序运行效率高才是模板设计 

的关键。 

标签以{开始,以/ 结束。 

{T IMPORT SRC引人代码文件名字/}这个标签是 

指示它所在的模版所要引用的.import程序文件。 

二、一个PHP编译型模板引擎介绍 

下面主要介绍我个人设计和实现的一个PHP编译 

型模板引擎。它已经成功地用在了PHPArticle v2.1.1和 

http://bbs.utspeed.tom这两个系统上。一个是内容管理系 

{T CODE BLOCK代码模块名字/}这个标签代 

表.import里定义的模块。 

{T TEMPLATE模版名字/ 这个标签代表模版。 

{T CHTML BLOCK混合模块名字 

<!~BEGIN子模版名字一> 

统(Content Manage System)和一个是BBS论坛系统。 

38 信息系统工程1 2012 4.20 

SYS PRACTICE 系统实践 

≥ 

子模版html代码 

<!一END子模版名字一> 

{T_HTML_BLOCK person_info/) 

<!—_I D show_info一 

/}这个是混合模板,里面的子模板定义,可以无限 

嵌套。 

{T_HTML_CODE子模版名字/)这个代表混合模板 

里面定义的子模板,作为PHP中的字符串来使用。 

{T_HTML—BLOCK子模版名字/}这个同上,只是 

上面的内容编译后生成test.php,内容如下: 

<title>编译型模板</title> 

<? 

¥teacher=“李四”; 

在使用的时候是作为html代码直接现实。 

下面举例说明其使用方法。 

模板文件分别为test.htm、header.htm、footer.htm。 

代码文件为test

_

src.import(文件名’

’前面的test 

对应test.htm中的test,说明这两个文件是相关联的)。 

1)test.htm的内容 

fT IMPORT SRC test/} 

fT TEMPLATE header/} 

{T_CHTML_BLOCK show—info 

<!一BEGIN personinfo一 

_

<b×?_\¥data[n锄e]?><,b> 

学号:<b> 

<?= 

<!一BEGINperson

no一 

_

学号:<b>\¥data[num]</b> 

<!一ENDperson

no一 

_

?> 

<b> 

老师:<?_\¥teacher?> 

<!一END personinfo一 

_

/) 

EMPLATE footer/} 

2)header.htm的内容 

<title>编译型模板</title> 

3)footer.htm的内容 

<b>www.phparticle.net版权所有</b> 

4)test src.import的内容 

<!一BEGIN show

info一 

<? 

¥teacher=“李四”; 

¥data=Array(name=>’张三’,num=>’1 23’); 

¥person

no=“{T

HTMLCODE person

no 

——

——

¥data=Array(name=>’张三’,num=>’123’); 

¥person

_

no=“学号:<b>¥data[num]</b>”; 

?> 

<b><?=¥data[name]?></b> 

学号:<b> 

<?= 

¥person

no 

_

?> 

<b> 

老师:<?=¥teacher?> 

<b>www.phparticle.net版权所有<,b> 

从上面可以看出,test.php就是一个完整的PHP程 

序。里面的标签全部都被替换掉了,包括test.htm和test 

src.import里面的。这样就可以完全的去除了对模板进行 

解析的过程。从test src.import的内容我们可以看出来, 

代码模块的定格式是前后添]JI1<!-BEGIN代码模块名 

和<!一END代码模块名一,其中还引用了两个标 

签{T

HTML

CODE person

_—_

no/}和{T

HTMLBLOCK 

—_

person—info/},前者是I)APHP字符串的方式引用,后者 

是在PHP代码外部引用,而且,person 

info 

模板在定义

的时候,用了嵌套,把person no子模板嵌套在它里面 

了。而且前后添加了<?=和?>,上面的代码就是: 

{T_CHTML_BLOCK show—info 

<!一BEGINperson

info一 

_

<b×?_\¥姒a【n锄e】?> > 

学号:<b> 

<?= 

<!一BEGINperson

no一 

_

学号:<b>\¥data[num]</b> 

<!一ENDperson

_

no一 

?> 

<b> 

老师:<?_\¥teacher?> 

<!--END person

info一 

_

/) 

(下转34页) 

信息系统工程I 2012.4.20 30 

< .<: REGIONLNFO数字地方 

及汕 丽 

 s (_ + )向右下方人射(16) 

故 

r=一

三、结论与讨论 

可见光线的轨迹为正弦波形,其空间周期为 

T:—2n s

in io(17) 

c =击七志 7 

其中,z2= uⅣ2(1一 ) 

代入

代^

得 

得 

: 

盟:一 二_ 

一 

从(17)式可看出,从不同方向入射的光线,其 

窘+鑫 

人射角不同,周期也不同。但是对于人射角非常小的 

兀 

光线,即io≈ ,sin f0 1时,具有近似相同的空间 

,) 

解出 =Asi解出 n(: _ +【+【p。)(9) 

(9)式中的A和(Po需要根据初始条件来确定,也 

即是入射光的方向和入射点来确定,在初始时刻 =0处 

r=0,故 sin(po=0(10) 

因 

周期 = 

仅 

,它的轨迹按照正弦波形的轨迹传播。还 

可看出,对于小角度的入射光线,在光纤内有自聚焦作 

用。 

实际的光学纤维的涂层并非完全的均匀介质,光学 

. 

0处,— l = —__coy 0=coti0(11)故 

ar1 

纤维的折射率沿径向的分布为 =no:(1一仅 , ),这 

种折射率的不均匀分布造成了光线在其中传播是按照正 

Act cos(p0=cosi0(12) 

弦波形的轨迹传播而非折线。正弦波形轨迹更符合实际 

光线的传导路径。在信号传输时,适当选择折射率的分 

布形式,可以使不同入射角的光线有大致相等的光程, 

从而大大减少群时延差,对于信号的传导非常有用。H 

参考文献 

【1]胡新珉.医学物理学第五版[M].北京:人们卫生出版 

社.2001:246—247. 

由(1 0)、(1 2)两式,解出9o=0或兀, 

: (13) 

当入射光向右上入射时,cosio>0,故cos(Po>0(Po=0; 

: 

(14) 

0【 

当人身恍向右下 寸时,∞s ,故c0s(p

如(p0 丁c; 

:一 fl51 

【2】潘志达.医学物理学【M】.北京:科学出版社,2009:212—213. 

因此,入射光从O点入射时,光线的轨迹方程为 

【3】李甲科.大学物理[M】.西安:西安交通大学出版社,2010. 

[4】姚启均.光学教程p .北京:高等教育出版社,2008:166-169. 

: s )向右上方人射, 

(作者单位:贵阳医学院物理教研室) 

(上接39页) 

no 

其中二级嵌套的person 子模板定义中前后添加

易用,而且可以直接用dreamweaver等常用的html所见 

即所得编辑工具直接编辑,在实现分离的同时,也很好 

<?=和?>,是由于其上级,也就是person info子模板是 

在PHP代码外部调用的,否则,不需要加上<?=和?>。 

person 

no

子模板最后被转换为 

<?=¥person 

no?>,定义

时子模板的名字和最终的变量 ¥,_

person no他们的名字 

地保证了运行效率。 

参考文献 

鞠 

[1】陆昌辉,熊帅,刘瑞涛.PHP WEB开发快速入门及实例精选fM】. 

北京:电子工业出版社。2008. 

相同。多以嵌套依次内推。这里就简要的举例说明了模 

板的设计与实现思路,模板引擎类的代码实现,可以参 

[2】陈营辉.PHP网络编程从入门到精通[M】.北京:清华大学,2007. 

[3】(美)西若威齐(美)迭里.搜索引擎优化高级编程一PHP版【M】.北 

京:清华大学,2008. 

看phpArticle v2.1.1种的文件template.inc.php。下载请访 

问、^n^n)l phparticle.net。 

(作者单位:广东邮电职业技术学院) 

三、结束语 

从上面的test.htm模板内容,我们可以看出其简单 

34 信息系统工程l 2012.4.20 


本文标签: 模板 编译 设计 代码 实现