转自:http://club.phpe.net/index.php?act=ST&f=15&t=12080

1 PHP资源模板——模板终结者  
2 导演:axgle  
3 主演:小程 小美   
4  
5 “曾经有一份珍贵的模板摆在我的面前,我没有珍惜;直到别人都在用了,我才后悔莫及!  
6 如果上天能再给我一次机会,我会对这个模板说三个字--我用你。如果要问我用多久,我希望是  
7 --一万年。”  
8     --《模板终结者》题记  
9  
10 第一回 E时代群雄逐鹿,侠骨柔情英雄路  
11  
12 第一次接触"PHP模板技术"这个字眼,是在一则介绍PHPlib的模板类的书籍上面。由于当时我水平有限,  
13 无法理解那个template类的代码,所以一度跳过那一章,懒得去理解,眼不见心不烦。  
14  
15 后来我的一个朋友向我请教关于模板的问题,我脑海中这才想起是有这么个印象,所以我借故很忙,答应  
16  
17 有空再帮助他...紧接着我就找到了那本书,仔细的阅读起来.  
18  
19 那是一个PHP模板类,名字就叫template,是PHPlib的一个独立部分.它使用"assign"方法指派变量,而核心  
20  
21 功能,也就是"变量替换"则是靠"preg_replace"这个PHP函数完成的。我很快理解了它的原理。  
22  
23 我当时的感觉是什么?我感觉很兴奋!是的,第一次把PHP和HTML分离开来,这是一种新奇的感觉!我忍不  
24  
25 住露出开心的微笑,并“嘿嘿”了两下--与此同时时,我发现旁边一个PLMM用奇怪的眼神看着我,所以我  
26  
27 得意而挑逗的说道:“看什么看?没见过帅哥啊?哈哈”  
28  
29 然而这种快乐的感觉如同恋爱的甜蜜一样,也会很快消失;所以才过去一天,template模板类就让我感觉  
30  
31 不舒服了。  
32  
33 最不爽的就是assign这个'动作'了.每次都要'指派变量',这个还不算麻烦,麻烦就在于每次都要输入"某  
34  
35 某对象->assign"这几个字母。我很讨厌单调而毫无创意的重复劳动,所以若要形容template模板类,那就  
36  
37 是一个字'烦',两个字'烦烦',三个字'烦烦烦'。  
38  
39 你也许要问,如果你不assign指派变量,那你怎么知道哪些'变量标记'需要替换呢?当时我的直觉就告诉  
40  
41 我:“PHP变量本身,就是最好的‘变量标记’”.如果我们直接给PHP变量赋值,不是更直接更方便么?  
42  
43 何需那几个多余的“某某对象->assign”的枯燥字符?  
44  
45 所以我想的是,如果能够直接用“给PHP变量赋值”的方法来指派变量的话,那该多好啊,而且还可以美  
46  
47 其名曰:“变量赋值法”。然而当时我不知道怎么来完成这个小小的功能。  
48  
49 时间一天一天过去。在一个细雨蒙蒙的早上,在一个不其眼的角落里,我发现了一个东西--那就是"<<<" 
50  
51 。你知道什么是"<<<"吗?--“Only you,是最好的符号;Only you,能直接赋值。你本领最大,就是Only   
52  
53 you。。。”  
54  
55 传说中的"<<<"名叫"heredoc"符号。这个heredoc符号在其他语言中也存在,这个我就不去考察了。我这  
56  
57 里举个简单的例子:  
58  
59 <?php  
60 $title="this is title";  
61 $text="this is text";  
62  
63 echo<<< EOT  
64  
65  $title 
66  <hr>  
67  $text,you can use "quote" without "/" 
68  
69 EOT;  
70 ?>  
71  
72 其中"EOT"表示"End of Template",与PHP或者C语言中的"EOF"符号命名方法类似,因为EOF表示"End of   
73  
74 File"。你可以选择其他符号代替EOT,其效果是一样的,它只起一个标志作用,其间的任何变量若与本页  
75  
76 上面的变量一样,则直接替换成变量的内容--这是一个很有用的特性。  
77  
78 为了便于叙述,我和大家约定:从echo<<< EOT开始到"EOT;"结束这一段文本,称为"heredoc".  
79  
80 heredoc只起输出显示作用,属于MVC中的view层。这让我想起一个忽悠人的词语,叫做"显示逻辑"。  
81 什么叫"显示逻辑"?英文翻译为"view logic"。其实很容易理解,就是"见人说人话,见鬼说鬼话".  
82  
83 例如:  
84 <?php  
85 $title="this is title";  
86 $text="this is text";  
87 $who="girl";  
88  
89  
90 if($who=="PHPer"){  
91  
92 echo<<< EOT  
93  
94  $title 
95  <hr>  
96  $text,you can use "quote" without "/" 
97  
98 EOT;  
99 }  
100  
101 else if($who=="girl";){  
102 echo<<< EOT  
103  Hi,$who,I love you~~  
104 EOT;  
105 }  
106  
107 ?>  
108  
109 从If开始到结束为止的代码,都属于"view logic",也就是“显示逻辑”.简单的说就是处理显示,也就  
110  
111 是“输出”,也就是使用“echo”。既然如此,为什么要在“显示”后面跟个“逻辑”呢?因为我们要  
112 "见人说人话,见鬼说鬼话"!如果"见鬼说人话,见人说鬼话",那么你在鬼面前就‘显示’为人,在人面  
113  
114 前就‘显示’为鬼了。  
115  
116 若你是个彻头彻尾的唯物论者,你坚定这个世界上根本没有鬼,换言之你的“view logic”也就很简单,  
117  
118 这样的话直接使用heredoc就可以了,不必在heredoc之前用if,else,for,foreach等等'逻辑型控制符号'.  
119  
120 为了便于叙述,我把只使用heredoc而不使用任何‘逻辑型控制符号’的代码,叫'simple view'.相反,  
121  
122 若在你的heredoc之前使用了任意一种‘逻辑型控制符号’,则表示你使用了'complex view'.  
123  
124 "simple view"可翻译为"简单视图",相应的'complex view'可翻译为"复杂视图"。之所以称为“复杂”,  
125  
126 是因为我假定这个世界上的人不总是勤快的,不总是聪明的,时间不总是充裕的,性别不总是相同的,所  
127  
128 以某些人看上去会觉得它非常的复杂。  
129  
130 对于美工来说,她最喜欢'simple view'.她不但头脑简单,而且身材窈窕,bo大无脑,感情用事,毫不考  
131  
132 虑逻辑。她名叫“小美”,艺术细胞发达,多才多艺,能歌善舞,设计的网页优美多情,引来无数仰慕者  
133  
134 欲吐衷肠,无奈不会做“留言本”--所以她找到了程序员'小程'。  
135  
136 对于程序员'小程'来说,他最喜欢'complex view'。只有'complex view',才能引起'小程'的兴趣,才  
137 能体现其'英雄'的形象。他是现实中的韦小宝,他八面玲珑,见风使舵,也就是会使用"If语句和switch 
138  
139 语句";他出口成章,滔滔不绝,也就是会使用"For语句和while语句"等等。他在皇帝面前显示为“忠臣”  
140  
141 ,在朋友面前显示为“仗义”,在美女面前显示为“多情”。如果他不使用'complex view'的话,是绝对  
142  
143 不能满足如此复杂的需求的--所以在美女面前,他也就算得上是一个英雄。既然只听说过"英雄救美",  
144  
145 没听说过"狗熊救美"的说法,所以小程与小美便自然而然的相遇了。  
146  
147 小美名如其人,所以小程很快就被小美迷住了。想当初,小程又当‘程序员’又当'美工',虽然能够完全  
148  
149 胜任程序员的工作,但对于‘美工’之类的事情,一直颇为自卑。尽管如此,小程却也能够得心应手的处  
150  
151 理‘两者’的关系--他在美工方面要求自己使用简约明快的风格,从而扬长避短,同时自己又对程序游刃  
152  
153 有余,所以‘又当爹来又当妈’,虽然有点累,但由于一切都在自己的‘掌控之中’,所以反倒觉得比较  
154  
155 ‘顺手’。  
156  
157 如今见到了小美,才知道原来世界可以如此美丽。他不禁感叹:这个世界不但有+-*/,原来还有红色的花  
158  
159 ,绿色的草,小鸟在唱歌,蝴蝶在跳舞。。。这是因为小美在播放自己的flash作品,小程看的眼睛都直  
160  
161 了。刹那间,倾慕之情便油然而生,即便小美叫他去死,他也再所不辞...正在小程心猿意马之时,小美  
162  
163 柔声说道:“小程哥,小女子早就听说您的PHP大法威震武林,在这个群雄逐鹿的E时代,能够与  
164  
165 jsp,asp.net三足鼎立,实在非英雄莫属。。。”小程立刻心花怒放,激动的话都说不出来了。小美接着  
166 说道:"小女子其实有一事相求。原本打算找Microsoft帮忙,因为听说他资产雄厚.谁知道他却是个吝啬鬼  
167  
168 ,小气无比,说什么他的东西只能够在他的地盘上使用,不允许踏出他家的后花园。我一听肺都快气炸了  
169  
170 ,发誓要找一个慷慨的朋友帮忙。于是经人介绍,我找到了java。java他确实是个非常慷慨的朋友,一点  
171  
172 也没有Microsoft的小气和吝啬,这点我道是比较满意。但是每当我看着他蹒跚的步伐,听着他慢吞吞的  
173  
174 声音,想着他还是个超级大胖子,我的心里就感到不舒服。也许是java看出了我的心思,所以他知趣的和  
175  
176 我告别了。临别之时,他对我说‘我有个同父异母的兄弟,名叫PHP,他3,4岁的时候非常瘦,我对他有  
177  
178 偏见,所以很讨厌他,但最近我收到他5岁的照片,发现他变强壮了,这才对他有了点好感。小美,你可  
179  
180 以去找找他,看看行不行。哦,对了,PHP是他的绰号,他真名叫小程’。告别了java,于是我便找到了您  
181  
182 。。。”小程禁不住沾沾自喜,得意洋洋,于是说道:“能得姑娘赏识,实乃三生有幸。姑娘有什么事尽  
183  
184 管开口,在下一定全力以赴,绝不会让姑娘您失望。”  
185  
186 就这样,小美希望小程帮忙做一个‘留言本’.这个留言本除了基本的功能外,还要提供十种不同的显示  
187 风格。这些不同的风格主要由小美负责完成,由于工作量巨大,小美把她的弟弟‘小工’也叫过来帮忙。  
188  
189 而小程则负责数据处理,编写程序。  
190  
191 这就存在一个问题:小程希望实现业务逻辑和表现逻辑的相互独立和分离:  
192  
193 1.php业务处理与html页面显示相互独立(不排斥在html中使用php标签);  
194 2.可以预先直接预览HTML的页面效果;  
195 3.预览时,页面之间的链接关系可以看到,就象一个不懂程序的设计者做的网站,全是静态页面,但这些  
196  
197 静态页面之间的关系是清晰的;  
198 4.速度要过得去。  
199  
200 这就是小程提出的“模板引擎四项原则”。想起这些原则和要求,便让他联想起那天晚上他与他弟弟“小  
201  
202 序”之间的对话。小程清楚的记得小序曾经说过:  
203 “我一直没有采用任何模板技术,因为我从来没有发现哪一种模板适合我,phplib、smarty、supertpl等  
204  
205 等,通通都不适合,想自己写,水平不够,也没时间和精力。  
206  
207 让我讨厌这些模板的原因是,它们不能展示界面的原形或者说是原貌!我们公司目标客户都是中小型的,  
208  
209 这些客户总是要求在程序未实现前能够看到所有的网页界面,所以,公司基本上都把重点放在美工上,而  
210  
211 对程序并不是很重视,这就存在一个很大的问题,由于每个设计者的风格不一样,导致交到我手里的界面  
212  
213 风格千奇百怪,很难做到“批量”处理,实在很累!更糟的是,除了个别设计者对程序有所了解外,其他  
214  
215 的简直是一窍不通,几乎每次我都要先把他们的界面修改一下才能嵌入程序,我一直在寻找一种简单又好  
216  
217 用的模板技术,能够在前期预览效果,如界面颜色、版式等,不让设计人员花太多的时间就能学会(他们  
218  
219 根本不愿意花时间学),也就是这种模板与他们平时设计的网页基本没什么区别,但我一直没看到这种模  
220  
221 板技术,实在让人失望! ”  
222  
223 确实,小序的失望也让小程颇有同感。正在思虑之际,忽然传来一个声音:“嘿,大哥,在想什么呢?该  
224  
225 不会是在想如何泡MM吧?呵呵。。”来者是小程的三弟,名叫‘小员’。“去去去,你大哥没你那么  
226 风流,从早到晚都想着泡MM...”“哪你想什么呢?想得那么出神?”于是小程把事情的经过一五一十的  
227 告诉了小员。  
228  
229 不料这小员很是生气,竟然用英语说道:“php really need these fucking template engins? No!  
230 Do not waste your time. Pay your time into your business requirements. ”  
231  
232 小程问道:“你叽里咕噜一些什么呢?”小员说道:“我的意思是说:php最好的模板语言就是php本身。  
233  
234 你没有必要去选择诸如smarty之类的这种食之无味,弃之亦不可惜的东西。”  
235  
236 小程道:“照你这么说,php最好的模板语言就是php本身,那么你的这个模板能够满足我的模板引擎四项  
237  
238 原则么?  
239  
240 1.php业务处理与html页面显示相互独立(不排斥在html中使用php标签);  
241 2.可以预先直接预览HTML的页面效果,包括图片;  
242 3.预览时,页面之间的链接关系可以看到,就象一个不懂程序的设计者做的网站,全是静态页面,但这些  
243  
244 静态页面之间的关系是清晰的;  
245 4.速度要过得去。  
246 ”  
247  
248 小员一时语塞。他心想:“记得smarty刚出现的时候我也曾是个鼓吹者, 所谓的自己的模板类也写过不少  
249  
250 , 公司里现在还是2种方式并存, 另一种用的是改了很多很多的smarttemplate, 不过现在已经基本停用了  
251  
252 . 当年用smarty写完一个论坛以后, 我就发誓再也不用这种垃圾东西了. 于是第二次写论坛的时候是  
253  
254 xml+xslt.见过形形色色的模板引擎模板方案,使我坚定一个正确的结论,那就是‘php最好的模板语言就  
255  
256 是php本身’然而要说到完全满足上面的模板引擎四项原则,几乎没有人做到过。即便是用php本身作为模  
257  
258 板引擎,也是如此。”  
259  
260 这时手机铃声响了起来。。。小员对小程说道:“公司有事需要我去处理,我们下次有空再聊这个话题。  
261  
262 哦,对了,你可以去和我的一个朋友axgle谈谈,据说他对这个话题比较有兴趣也很有心得,你不妨去找  
263  
264 找他。拜拜。”“喂,别跑啊,他的QQ号是多少啊。。。”“380139552——”  
265  
266 欲知后事如何,且听下回分解——  
267  
268 第二回 资源模板横空出世,华山论剑再起风云  
269  
270 话分两头。却说这axgle正打算写一则有关模板的文章,忽然看到有人加自己的qq。只见附加消息中写着  
271 “小员的朋友”,于是接受请求,开始聊天。  
272  
273 “您好啊Axgle,听闻您的大名,如雷贯耳哦。”  
274 “阁下是?”  
275 “在下是小员的哥哥,名叫小程。听闻您对PHP模板颇有研究,所以特来取经,还请您多多指教”  
276 “客气客气。研究谈不上,不过是略有心得。大家互相讨论,互相学习最好啦”  
277 “那么,您对‘模板引擎四项原则’作何看法?”  
278 “哈哈,真是英雄所见雷同啊!哦,不好意思——是英雄所见略同”  
279 “那么Axgle您对此有何高见,从而能够实现这个目标呢?”  
280 “不瞒您说,我正在为此写一篇文章,名叫《模板终结者》,在详细的讨论这个问题。”  
281 “不知现在您完成了多少,真想先睹为快。。。”  
282 “呵呵,目前正写到第二回‘资源模板横空出世,华山论剑再起风云’,到你现在看到的这句话为止,包  
283  
284 括句号和引号。当然后面的引号你看不到,因为QQ中一般不打引号。”  
285 “知道了。那为什么第二回是这个标题呢?”  
286 “因为第二回我会向大家介绍‘资源模板’的来龙去脉;另外,我的网名叫‘华山论剑’,而你叫‘再起  
287  
288 风云’,所以这样以来便可以给读者一个完美的交代。”  
289 “原来如此。您真是幽默啊,把大家忽悠的团团转。”  
290 “罪过罪过,南无阿弥陀佛。。。出家人不打诳语。请容在下详加解释,也请大家洗耳恭听。”  
291 ——1.PHP资源模板是什么东东?  
292  
293 这里的‘资源’,是指用来创建网页的各种辅助元素,例如各种图象,js脚本,css样式文档等,同样也可  
294  
295 以包括flash中的swf文件等等,诸如此类的‘可连接的非HTML元素’。  
296  
297  
298 ‘资源’通常都是‘通用性’的,可以反复出现。例如同样一幅图象可以在各种不同的页面出现。因此  
299 所有的资源文件,都可以放到一个文件夹中。我们不妨把这个文件夹命名为“assets”。  
300  
301 在assets文件夹下,为了便于区分和管理,可以按照种类的不同新建各种不同的文件夹,例如images,  
302 javascript,css,flash等等。其目录结构如下:  
303  
304 assets:  
305     |-images  
306     |-javascript  
307     |-css  
308     |-flash  
309  
310 这样的目录结构是清晰而有序的,不至于让一切变得混乱不堪。  
311  
312 我们把任何html文件放到与assets同级的目录中,你一定同意这是理所当然的事情:  
313 例如:  
314  
315 index.htm  
316 register.htm  
317 post.htm  
318 ...  
319 assets:  
320    |-略  
321  
322  
323 因为这样一来,所有的路径可以使用相对路径,能够直接与assets中的资源文件建立‘连接’。  
324  
325 例如index.htm中需要一个Logo图片,其路径为‘assets/images/logo.gif’。  
326  
327 我们规定这些HTML文件与assets一道,统称为‘视图文件’,或者称为‘模板文件’。为了便于  
328 区分和管理,我们给它取个名字,例如“default”,并且新建一个default文件夹,把这些“模板文件”  
329  
330 全部放入其中。  
331  
332 因为同样的数据可以有不同的显示风格,所以视图可以有多种,换言之可以有多种不同的风格。我们可以  
333  
334 如法炮制,建立多份‘模板文件’,并且分别取个名字,与‘default’文件夹一样处理。  
335  
336 由于有多种不同的视图,于是我们看到的目录结构如下:  
337 default:  
338     index.htm  
339     assets:  
340       |-略  
341  
342 other_style:  
343     index.htm  
344     assets:  
345       |-略  
346  
347 为了便于与PHP文件区分,我们可以把‘default’,‘other_style’等放入同一个文件夹中,通常取个  
348  
349 名字叫‘template’,但我别出心裁,不遵循这一点,而是取名字叫‘view’.因为我认为‘view’比  
350  
351 “template”更能够更好的表达我的思想。  
352 新建一个文件夹,取名“view”:  
353  
354 于是其结构变成:  
355 view:  
356     default 
357     other_style  
358 到此为止,视图目录便大功告成了。  
359  
360 接下来就是PHP目录问题了。这是核心和关键,请大家仔细体会。  
361  
362 我们假设存在index.php文件,把它放在与‘view’文件夹同级的目录中。现在index.php从某处取得数据  
363  
364 后,需要调用index.htm文件负责显示了。我们假设它选择‘default’风格,那么相对于index.php文件  
365  
366 ,其对应的index.htm的路径为‘view/default/index.htm’。  
367  
368 无论你使用什么模板引擎来处理现在的问题,你都会发现‘资源文件无法共享’。  
369 例如在上面的情况中,logo.gif图片就无法在index.php中正常显示。因为index.php  
370 与index.htm不在同级目录中,而index.htm文件却使用的是相对路径来连接图片。  
371  
372 为此您该怎么办?你可能会有如下方案来解决这个问题:  
373  
374 方案一:  
375  
376 您可能会说:“axlge你是猪头啊。你不晓得把index.php文件和index.htm文件放到同级目录中不就可以  
377  
378 了嘛?”  
379  
380 如果是只有一种风格,道是可以这样做;但即便如此,把html文件与php文件放到同一个目录,也让人略  
381  
382 有混乱之感。我认为这样并不好,因为修改起来不方便。毕竟我们希望程序员和美工能够各有各的‘地盘  
383  
384 ’,相互的关联越少越好。  
385  
386 所以方案一可以被否决。  
387  
388 方案二:  
389  
390 您可能会说:“axlge你是猪头啊。你不晓得把相应的‘资源文件’,例如图片复制一份到相应的目录中  
391  
392 ,不就可以了么?”  
393  
394 是的,这是可行的。但并不‘优美’。因为如果某张图片被修改,则相应的图片需要从新复制一次。何况  
395  
396 有时候资源文件的数量相当庞大。而我却有办法无须复制就可以共享同一个‘资源文件’  
397  
398 所以方案二可以被否决。  
399  
400 方案三:  
401  
402 您可能会说:“axlge你是猪头啊。你不晓得使用str_replace或者preg_replace函数进行路径转化吗?”  
403  
404 是的,我晓得。但我不认为“读取文件不说,还要进行‘模式匹配’”是一件值得去做的事情。简单的说  
405  
406 ,我反对使用PHP中的任何‘replace’函数应用于模板引擎中。  
407  
408 所以方案三可以被否决。  
409  
410  
411 最后您终于忍无可忍,冒火了:“我靠,说了半天我道是想问问:你何苦要求要在PHP和html中都能预览  
412  
413 到图片呢?”  
414  
415 那是因为市面上已知的模板引擎中,其模板文件在浏览器中打开的时候,都相当的丑陋。要么不干不净,  
416  
417 长满麻子;要么破破烂烂,衣观不整(例如图片无法显示)。  
418  
419 其实这个问题难倒过无数英雄好汉。我以前也写过一则文章,来解决这个问题。文章标题叫《给文件夹加  
420  
421 上$符号》。套用这篇文章的思想,我们可以这样来解决这个难题,那就是给‘assets’文件夹前面  
422 加上一个“$”符号。  
423  
424 换言之,就是使用“$assets”代替原来的“assets”作为文件夹的名字。  
425  
426 现在,为了理解这样做的作用,让我们暂时把注意力和视线放到美工身上。假设小美设计了一个  
427  
428 index.htm页面,该页面包含一幅logo图片。那么这个logo图片的路径为“$assets/images/logo.gif”  
429 其相应的html为:<img src="$assets/images/logo.gif">。显然在index.htm中能够正常显示图片。  
430  
431 下面再把视线转移到PHP程序员上面来。假设小程在index.php中调用index.htm文件,在include之前,定  
432  
433 义一个PHP变量,名字也叫‘$assets’.代码大体如下:  
434  
435 <?php  
436 $assets='view/default/$assets';//这里使用单引号,防止后一个$assets被PHP当成变量。  
437  
438 include 'view/default/index.htm';  
439 ...  
440 ?>  
441  
442 当执行上面的代码后,index.php生成的html变成了这样:  
443  
444 ...<img src="view/default/$assets/images/logo.gif">...  
445  
446 因为等效的PHP代码如下:  
447  
448 <?php  
449 $assets='view/default/$assets';  
450  
451 echo<<< EOT  
452 <img src="$assets/images/logo.gif">  
453 EOT;  
454 ...  
455 ?>  
456  
457 上面的第三个$assets与第一个$assets同名,所以直接就被替换掉了。  
458  
459 前提当然是index.htm中使用了‘heredoc’。  
460  
461 这样以来,图片的显示问题就被巧妙的解决了。无论是在index.php中还是在index.htm中都能够顺利的  
462 显示图片。  
463  
464 同理,其他javascript,js,css,swf文件也能够正常运行或显示。一切只需要“一个$符号+一个heredoc”  
465  
466 另外一个问题就是html文件显示的时候“干不干净净”的问题。因为index.htm中使用了heredoc,所以有  
467  
468 php符号"echo<<<EOT",那么可以使用“<!---->”注释符号隐藏它。这样就显得干净了。在预览的时候,  
469  
470 html显示的就是其‘原貌’。  
471  
472 最后一个问题就是:“预览时,要求页面之间的链接关系可以看到,就象一个不懂程序的设计者做的网站  
473  
474 ,全是静态页面,但这些静态页面之间的关系是清晰的”  
475  
476 例如:index.htm里有个超级连接,连接到register.htm.其html代码如下:  
477 <a href="register.htm">注册</a>。这样一来就能够满足上面的要求。  
478  
479 但PHP这边该怎么办呢?假设存在一个处理注册的PHP文件,名叫“register.php”.那么index.php如何超  
480  
481 级连接到register.php上面呢?  
482  
483 这个其实很简单,可以在PHP中输出一段javascript,让浏览器自动把超级连接修改一下就可以了。  
484  
485 这就是全部。如果文字叙述不能够让你理解,您可以参考后面附加的演示文挡,那么一切都会显得很简单  
486  
487 。  
488  
489 第三回 要简单还是要复杂,这不是问题  
490  
491 有人说,在模板文件中嵌入PHP代码,这对于美工人员来说‘太复杂’了。即使我上面介绍的资源模板已  
492  
493 经为美工人员考虑的比较周到了,但还是会有一部分人心里会觉得不舒服。  
494  
495 我虽然是仁慈的,但‘现实’却是残酷的,这句话的意思是说:不使用循环语句,你将无法批量输出。你  
496  
497 一定会表示同意。但你依然会争辩说:“为什么不可以在html文件中把批量输出的部分用一个变量来代替  
498  
499 ,然后在php中为这个变量赋值呢?例如一个表格的填充,在PHP文件中生成表格不就得了”。  
500  
501 你当然可以那样做,但你却违背了“可预先预览”的原则。表格的字段名称最好是在html中能够直接显示  
502  
503 出来,以便能够更加直观的反映网页的输出目标和意图。  
504  
505 所以请你不要介意在html文件中插入的少许控制流程的PHP代码。  
506  
507 但基于MVC的要求,html文件中不应该存在数据分析和处理的代码(例如连接数据库),换言之html模板文  
508  
509 件只负责“显示逻辑”,而不要管其他任何事情。当然在简单的应用中,你可以使用‘simple view’,  
510  
511 里面的PHP代码就最少,往往只有一个'heredoc'。  
512  
513 诚如‘小员’所说:“PHP最好的模板语言就是PHP本身”。而‘PHP资源模板’可以说是很好的贯彻了这  
514  
515 个思想。不但如此,更是巧妙的实现了“模板引擎四项原则”,可以说是‘前无古人,后无来者。念天地  
516  
517 之悠悠,独苍然而泣下’——不要误会,那是‘高兴的眼泪’。  
518  
519 所以不管是简单还是复杂,PHP资源模板都是最棒的,它就是传说中的‘模板终结者’,“只要有了它,  
520  
521 你的一生都会改变,在你使用它之前,我要提醒你,尘世间的任何其他模板,你都无须再有半点留恋。”  
522  
523 “曾经有一份珍贵的模板摆在我的面前,我没有珍惜;直到别人都在用了,我才后悔莫及!  
524 如果上天能再给我一次机会,我会对这个模板说三个字--我用你。如果要问我用多久,我希望是  
525 --一万年。”  
526  
527 附:《资源模板演示文档》 
  view plain | print | copy to clipboard | ?

PHP资源模板——模板终结者 导演:axgle 主演:小程 小美  “曾经有一份珍贵的模板摆在我的面前,我没有珍惜;直到别人都在用了,我才后悔莫及! 如果上天能再给我一次机会,我会对这个模板说三个字--我用你。如果要问我用多久,我希望是 --一万年。” --《模板终结者》题记 第一回 E时代群雄逐鹿,侠骨柔情英雄路 第一次接触"PHP模板技术"这个字眼,是在一则介绍PHPlib的模板类的书籍上面。由于当时我水平有限, 无法理解那个template类的代码,所以一度跳过那一章,懒得去理解,眼不见心不烦。 后来我的一个朋友向我请教关于模板的问题,我脑海中这才想起是有这么个印象,所以我借故很忙,答应 有空再帮助他...紧接着我就找到了那本书,仔细的阅读起来. 那是一个PHP模板类,名字就叫template,是PHPlib的一个独立部分.它使用"assign"方法指派变量,而核心 功能,也就是"变量替换"则是靠"preg_replace"这个PHP函数完成的。我很快理解了它的原理。 我当时的感觉是什么?我感觉很兴奋!是的,第一次把PHP和HTML分离开来,这是一种新奇的感觉!我忍不 住露出开心的微笑,并“嘿嘿”了两下--与此同时时,我发现旁边一个PLMM用奇怪的眼神看着我,所以我 得意而挑逗的说道:“看什么看?没见过帅哥啊?哈哈” 然而这种快乐的感觉如同恋爱的甜蜜一样,也会很快消失;所以才过去一天,template模板类就让我感觉 不舒服了。 最不爽的就是assign这个'动作'了.每次都要'指派变量',这个还不算麻烦,麻烦就在于每次都要输入"某 某对象->assign"这几个字母。我很讨厌单调而毫无创意的重复劳动,所以若要形容template模板类,那就 是一个字'烦',两个字'烦烦',三个字'烦烦烦'。 你也许要问,如果你不assign指派变量,那你怎么知道哪些'变量标记'需要替换呢?当时我的直觉就告诉 我:“PHP变量本身,就是最好的‘变量标记’”.如果我们直接给PHP变量赋值,不是更直接更方便么? 何需那几个多余的“某某对象->assign”的枯燥字符? 所以我想的是,如果能够直接用“给PHP变量赋值”的方法来指派变量的话,那该多好啊,而且还可以美 其名曰:“变量赋值法”。然而当时我不知道怎么来完成这个小小的功能。 时间一天一天过去。在一个细雨蒙蒙的早上,在一个不其眼的角落里,我发现了一个东西--那就是"<<<" 。你知道什么是"<<<"吗?--“Only you,是最好的符号;Only you,能直接赋值。你本领最大,就是Only you。。。” 传说中的"<<<"名叫"heredoc"符号。这个heredoc符号在其他语言中也存在,这个我就不去考察了。我这 里举个简单的例子: <?php $title="this is title"; $text="this is text"; echo<<< EOT $title <hr> $text,you can use "quote" without "/" EOT; ?> 其中"EOT"表示"End of Template",与PHP或者C语言中的"EOF"符号命名方法类似,因为EOF表示"End of File"。你可以选择其他符号代替EOT,其效果是一样的,它只起一个标志作用,其间的任何变量若与本页 上面的变量一样,则直接替换成变量的内容--这是一个很有用的特性。 为了便于叙述,我和大家约定:从echo<<< EOT开始到"EOT;"结束这一段文本,称为"heredoc". heredoc只起输出显示作用,属于MVC中的view层。这让我想起一个忽悠人的词语,叫做"显示逻辑"。 什么叫"显示逻辑"?英文翻译为"view logic"。其实很容易理解,就是"见人说人话,见鬼说鬼话". 例如: <?php $title="this is title"; $text="this is text"; $who="girl"; if($who=="PHPer"){ echo<<< EOT $title <hr> $text,you can use "quote" without "/" EOT; } else if($who=="girl";){ echo<<< EOT Hi,$who,I love you~~ EOT; } ?> 从If开始到结束为止的代码,都属于"view logic",也就是“显示逻辑”.简单的说就是处理显示,也就 是“输出”,也就是使用“echo”。既然如此,为什么要在“显示”后面跟个“逻辑”呢?因为我们要 "见人说人话,见鬼说鬼话"!如果"见鬼说人话,见人说鬼话",那么你在鬼面前就‘显示’为人,在人面 前就‘显示’为鬼了。 若你是个彻头彻尾的唯物论者,你坚定这个世界上根本没有鬼,换言之你的“view logic”也就很简单, 这样的话直接使用heredoc就可以了,不必在heredoc之前用if,else,for,foreach等等'逻辑型控制符号'. 为了便于叙述,我把只使用heredoc而不使用任何‘逻辑型控制符号’的代码,叫'simple view'.相反, 若在你的heredoc之前使用了任意一种‘逻辑型控制符号’,则表示你使用了'complex view'. "simple view"可翻译为"简单视图",相应的'complex view'可翻译为"复杂视图"。之所以称为“复杂”, 是因为我假定这个世界上的人不总是勤快的,不总是聪明的,时间不总是充裕的,性别不总是相同的,所 以某些人看上去会觉得它非常的复杂。 对于美工来说,她最喜欢'simple view'.她不但头脑简单,而且身材窈窕,bo大无脑,感情用事,毫不考 虑逻辑。她名叫“小美”,艺术细胞发达,多才多艺,能歌善舞,设计的网页优美多情,引来无数仰慕者 欲吐衷肠,无奈不会做“留言本”--所以她找到了程序员'小程'。 对于程序员'小程'来说,他最喜欢'complex view'。只有'complex view',才能引起'小程'的兴趣,才 能体现其'英雄'的形象。他是现实中的韦小宝,他八面玲珑,见风使舵,也就是会使用"If语句和switch 语句";他出口成章,滔滔不绝,也就是会使用"For语句和while语句"等等。他在皇帝面前显示为“忠臣” ,在朋友面前显示为“仗义”,在美女面前显示为“多情”。如果他不使用'complex view'的话,是绝对 不能满足如此复杂的需求的--所以在美女面前,他也就算得上是一个英雄。既然只听说过"英雄救美", 没听说过"狗熊救美"的说法,所以小程与小美便自然而然的相遇了。 小美名如其人,所以小程很快就被小美迷住了。想当初,小程又当‘程序员’又当'美工',虽然能够完全 胜任程序员的工作,但对于‘美工’之类的事情,一直颇为自卑。尽管如此,小程却也能够得心应手的处 理‘两者’的关系--他在美工方面要求自己使用简约明快的风格,从而扬长避短,同时自己又对程序游刃 有余,所以‘又当爹来又当妈’,虽然有点累,但由于一切都在自己的‘掌控之中’,所以反倒觉得比较 ‘顺手’。 如今见到了小美,才知道原来世界可以如此美丽。他不禁感叹:这个世界不但有+-*/,原来还有红色的花 ,绿色的草,小鸟在唱歌,蝴蝶在跳舞。。。这是因为小美在播放自己的flash作品,小程看的眼睛都直 了。刹那间,倾慕之情便油然而生,即便小美叫他去死,他也再所不辞...正在小程心猿意马之时,小美 柔声说道:“小程哥,小女子早就听说您的PHP大法威震武林,在这个群雄逐鹿的E时代,能够与 jsp,asp.net三足鼎立,实在非英雄莫属。。。”小程立刻心花怒放,激动的话都说不出来了。小美接着 说道:"小女子其实有一事相求。原本打算找Microsoft帮忙,因为听说他资产雄厚.谁知道他却是个吝啬鬼 ,小气无比,说什么他的东西只能够在他的地盘上使用,不允许踏出他家的后花园。我一听肺都快气炸了 ,发誓要找一个慷慨的朋友帮忙。于是经人介绍,我找到了java。java他确实是个非常慷慨的朋友,一点 也没有Microsoft的小气和吝啬,这点我道是比较满意。但是每当我看着他蹒跚的步伐,听着他慢吞吞的 声音,想着他还是个超级大胖子,我的心里就感到不舒服。也许是java看出了我的心思,所以他知趣的和 我告别了。临别之时,他对我说‘我有个同父异母的兄弟,名叫PHP,他3,4岁的时候非常瘦,我对他有 偏见,所以很讨厌他,但最近我收到他5岁的照片,发现他变强壮了,这才对他有了点好感。小美,你可 以去找找他,看看行不行。哦,对了,PHP是他的绰号,他真名叫小程’。告别了java,于是我便找到了您 。。。”小程禁不住沾沾自喜,得意洋洋,于是说道:“能得姑娘赏识,实乃三生有幸。姑娘有什么事尽 管开口,在下一定全力以赴,绝不会让姑娘您失望。” 就这样,小美希望小程帮忙做一个‘留言本’.这个留言本除了基本的功能外,还要提供十种不同的显示 风格。这些不同的风格主要由小美负责完成,由于工作量巨大,小美把她的弟弟‘小工’也叫过来帮忙。 而小程则负责数据处理,编写程序。 这就存在一个问题:小程希望实现业务逻辑和表现逻辑的相互独立和分离: 1.php业务处理与html页面显示相互独立(不排斥在html中使用php标签); 2.可以预先直接预览HTML的页面效果; 3.预览时,页面之间的链接关系可以看到,就象一个不懂程序的设计者做的网站,全是静态页面,但这些 静态页面之间的关系是清晰的; 4.速度要过得去。 这就是小程提出的“模板引擎四项原则”。想起这些原则和要求,便让他联想起那天晚上他与他弟弟“小 序”之间的对话。小程清楚的记得小序曾经说过: “我一直没有采用任何模板技术,因为我从来没有发现哪一种模板适合我,phplib、smarty、supertpl等 等,通通都不适合,想自己写,水平不够,也没时间和精力。 让我讨厌这些模板的原因是,它们不能展示界面的原形或者说是原貌!我们公司目标客户都是中小型的, 这些客户总是要求在程序未实现前能够看到所有的网页界面,所以,公司基本上都把重点放在美工上,而 对程序并不是很重视,这就存在一个很大的问题,由于每个设计者的风格不一样,导致交到我手里的界面 风格千奇百怪,很难做到“批量”处理,实在很累!更糟的是,除了个别设计者对程序有所了解外,其他 的简直是一窍不通,几乎每次我都要先把他们的界面修改一下才能嵌入程序,我一直在寻找一种简单又好 用的模板技术,能够在前期预览效果,如界面颜色、版式等,不让设计人员花太多的时间就能学会(他们 根本不愿意花时间学),也就是这种模板与他们平时设计的网页基本没什么区别,但我一直没看到这种模 板技术,实在让人失望! ” 确实,小序的失望也让小程颇有同感。正在思虑之际,忽然传来一个声音:“嘿,大哥,在想什么呢?该 不会是在想如何泡MM吧?呵呵。。”来者是小程的三弟,名叫‘小员’。“去去去,你大哥没你那么 风流,从早到晚都想着泡MM...”“哪你想什么呢?想得那么出神?”于是小程把事情的经过一五一十的 告诉了小员。 不料这小员很是生气,竟然用英语说道:“php really need these fucking template engins? No! Do not waste your time. Pay your time into your business requirements. ” 小程问道:“你叽里咕噜一些什么呢?”小员说道:“我的意思是说:php最好的模板语言就是php本身。 你没有必要去选择诸如smarty之类的这种食之无味,弃之亦不可惜的东西。” 小程道:“照你这么说,php最好的模板语言就是php本身,那么你的这个模板能够满足我的模板引擎四项 原则么? 1.php业务处理与html页面显示相互独立(不排斥在html中使用php标签); 2.可以预先直接预览HTML的页面效果,包括图片; 3.预览时,页面之间的链接关系可以看到,就象一个不懂程序的设计者做的网站,全是静态页面,但这些 静态页面之间的关系是清晰的; 4.速度要过得去。 ” 小员一时语塞。他心想:“记得smarty刚出现的时候我也曾是个鼓吹者, 所谓的自己的模板类也写过不少 , 公司里现在还是2种方式并存, 另一种用的是改了很多很多的smarttemplate, 不过现在已经基本停用了 . 当年用smarty写完一个论坛以后, 我就发誓再也不用这种垃圾东西了. 于是第二次写论坛的时候是 xml+xslt.见过形形色色的模板引擎模板方案,使我坚定一个正确的结论,那就是‘php最好的模板语言就 是php本身’然而要说到完全满足上面的模板引擎四项原则,几乎没有人做到过。即便是用php本身作为模 板引擎,也是如此。” 这时手机铃声响了起来。。。小员对小程说道:“公司有事需要我去处理,我们下次有空再聊这个话题。 哦,对了,你可以去和我的一个朋友axgle谈谈,据说他对这个话题比较有兴趣也很有心得,你不妨去找 找他。拜拜。”“喂,别跑啊,他的QQ号是多少啊。。。”“380139552——” 欲知后事如何,且听下回分解—— 第二回 资源模板横空出世,华山论剑再起风云 话分两头。却说这axgle正打算写一则有关模板的文章,忽然看到有人加自己的qq。只见附加消息中写着 “小员的朋友”,于是接受请求,开始聊天。 “您好啊Axgle,听闻您的大名,如雷贯耳哦。” “阁下是?” “在下是小员的哥哥,名叫小程。听闻您对PHP模板颇有研究,所以特来取经,还请您多多指教” “客气客气。研究谈不上,不过是略有心得。大家互相讨论,互相学习最好啦” “那么,您对‘模板引擎四项原则’作何看法?” “哈哈,真是英雄所见雷同啊!哦,不好意思——是英雄所见略同” “那么Axgle您对此有何高见,从而能够实现这个目标呢?” “不瞒您说,我正在为此写一篇文章,名叫《模板终结者》,在详细的讨论这个问题。” “不知现在您完成了多少,真想先睹为快。。。” “呵呵,目前正写到第二回‘资源模板横空出世,华山论剑再起风云’,到你现在看到的这句话为止,包 括句号和引号。当然后面的引号你看不到,因为QQ中一般不打引号。” “知道了。那为什么第二回是这个标题呢?” “因为第二回我会向大家介绍‘资源模板’的来龙去脉;另外,我的网名叫‘华山论剑’,而你叫‘再起 风云’,所以这样以来便可以给读者一个完美的交代。” “原来如此。您真是幽默啊,把大家忽悠的团团转。” “罪过罪过,南无阿弥陀佛。。。出家人不打诳语。请容在下详加解释,也请大家洗耳恭听。” ——1.PHP资源模板是什么东东? 这里的‘资源’,是指用来创建网页的各种辅助元素,例如各种图象,js脚本,css样式文档等,同样也可 以包括flash中的swf文件等等,诸如此类的‘可连接的非HTML元素’。 ‘资源’通常都是‘通用性’的,可以反复出现。例如同样一幅图象可以在各种不同的页面出现。因此 所有的资源文件,都可以放到一个文件夹中。我们不妨把这个文件夹命名为“assets”。 在assets文件夹下,为了便于区分和管理,可以按照种类的不同新建各种不同的文件夹,例如images, javascript,css,flash等等。其目录结构如下: assets: |-images |-javascript |-css |-flash 这样的目录结构是清晰而有序的,不至于让一切变得混乱不堪。 我们把任何html文件放到与assets同级的目录中,你一定同意这是理所当然的事情: 例如: index.htm register.htm post.htm ... assets: |-略 因为这样一来,所有的路径可以使用相对路径,能够直接与assets中的资源文件建立‘连接’。 例如index.htm中需要一个Logo图片,其路径为‘assets/images/logo.gif’。 我们规定这些HTML文件与assets一道,统称为‘视图文件’,或者称为‘模板文件’。为了便于 区分和管理,我们给它取个名字,例如“default”,并且新建一个default文件夹,把这些“模板文件” 全部放入其中。 因为同样的数据可以有不同的显示风格,所以视图可以有多种,换言之可以有多种不同的风格。我们可以 如法炮制,建立多份‘模板文件’,并且分别取个名字,与‘default’文件夹一样处理。 由于有多种不同的视图,于是我们看到的目录结构如下: default: index.htm assets: |-略 other_style: index.htm assets: |-略 为了便于与PHP文件区分,我们可以把‘default’,‘other_style’等放入同一个文件夹中,通常取个 名字叫‘template’,但我别出心裁,不遵循这一点,而是取名字叫‘view’.因为我认为‘view’比 “template”更能够更好的表达我的思想。 新建一个文件夹,取名“view”: 于是其结构变成: view: default other_style 到此为止,视图目录便大功告成了。 接下来就是PHP目录问题了。这是核心和关键,请大家仔细体会。 我们假设存在index.php文件,把它放在与‘view’文件夹同级的目录中。现在index.php从某处取得数据 后,需要调用index.htm文件负责显示了。我们假设它选择‘default’风格,那么相对于index.php文件 ,其对应的index.htm的路径为‘view/default/index.htm’。 无论你使用什么模板引擎来处理现在的问题,你都会发现‘资源文件无法共享’。 例如在上面的情况中,logo.gif图片就无法在index.php中正常显示。因为index.php 与index.htm不在同级目录中,而index.htm文件却使用的是相对路径来连接图片。 为此您该怎么办?你可能会有如下方案来解决这个问题: 方案一: 您可能会说:“axlge你是猪头啊。你不晓得把index.php文件和index.htm文件放到同级目录中不就可以 了嘛?” 如果是只有一种风格,道是可以这样做;但即便如此,把html文件与php文件放到同一个目录,也让人略 有混乱之感。我认为这样并不好,因为修改起来不方便。毕竟我们希望程序员和美工能够各有各的‘地盘 ’,相互的关联越少越好。 所以方案一可以被否决。 方案二: 您可能会说:“axlge你是猪头啊。你不晓得把相应的‘资源文件’,例如图片复制一份到相应的目录中 ,不就可以了么?” 是的,这是可行的。但并不‘优美’。因为如果某张图片被修改,则相应的图片需要从新复制一次。何况 有时候资源文件的数量相当庞大。而我却有办法无须复制就可以共享同一个‘资源文件’ 所以方案二可以被否决。 方案三: 您可能会说:“axlge你是猪头啊。你不晓得使用str_replace或者preg_replace函数进行路径转化吗?” 是的,我晓得。但我不认为“读取文件不说,还要进行‘模式匹配’”是一件值得去做的事情。简单的说 ,我反对使用PHP中的任何‘replace’函数应用于模板引擎中。 所以方案三可以被否决。 最后您终于忍无可忍,冒火了:“我靠,说了半天我道是想问问:你何苦要求要在PHP和html中都能预览 到图片呢?” 那是因为市面上已知的模板引擎中,其模板文件在浏览器中打开的时候,都相当的丑陋。要么不干不净, 长满麻子;要么破破烂烂,衣观不整(例如图片无法显示)。 其实这个问题难倒过无数英雄好汉。我以前也写过一则文章,来解决这个问题。文章标题叫《给文件夹加 上$符号》。套用这篇文章的思想,我们可以这样来解决这个难题,那就是给‘assets’文件夹前面 加上一个“$”符号。 换言之,就是使用“$assets”代替原来的“assets”作为文件夹的名字。 现在,为了理解这样做的作用,让我们暂时把注意力和视线放到美工身上。假设小美设计了一个 index.htm页面,该页面包含一幅logo图片。那么这个logo图片的路径为“$assets/images/logo.gif” 其相应的html为:<img src="$assets/images/logo.gif">。显然在index.htm中能够正常显示图片。 下面再把视线转移到PHP程序员上面来。假设小程在index.php中调用index.htm文件,在include之前,定 义一个PHP变量,名字也叫‘$assets’.代码大体如下: <?php $assets='view/default/$assets';//这里使用单引号,防止后一个$assets被PHP当成变量。 include 'view/default/index.htm'; ... ?> 当执行上面的代码后,index.php生成的html变成了这样: ...<img src="view/default/$assets/images/logo.gif">... 因为等效的PHP代码如下: <?php $assets='view/default/$assets'; echo<<< EOT <img src="$assets/images/logo.gif"> EOT; ... ?> 上面的第三个$assets与第一个$assets同名,所以直接就被替换掉了。 前提当然是index.htm中使用了‘heredoc’。 这样以来,图片的显示问题就被巧妙的解决了。无论是在index.php中还是在index.htm中都能够顺利的 显示图片。 同理,其他javascript,js,css,swf文件也能够正常运行或显示。一切只需要“一个$符号+一个heredoc” 另外一个问题就是html文件显示的时候“干不干净净”的问题。因为index.htm中使用了heredoc,所以有 php符号"echo<<<EOT",那么可以使用“<!---->”注释符号隐藏它。这样就显得干净了。在预览的时候, html显示的就是其‘原貌’。 最后一个问题就是:“预览时,要求页面之间的链接关系可以看到,就象一个不懂程序的设计者做的网站 ,全是静态页面,但这些静态页面之间的关系是清晰的” 例如:index.htm里有个超级连接,连接到register.htm.其html代码如下: <a href="register.htm">注册</a>。这样一来就能够满足上面的要求。 但PHP这边该怎么办呢?假设存在一个处理注册的PHP文件,名叫“register.php”.那么index.php如何超 级连接到register.php上面呢? 这个其实很简单,可以在PHP中输出一段javascript,让浏览器自动把超级连接修改一下就可以了。 这就是全部。如果文字叙述不能够让你理解,您可以参考后面附加的演示文挡,那么一切都会显得很简单 。 第三回 要简单还是要复杂,这不是问题 有人说,在模板文件中嵌入PHP代码,这对于美工人员来说‘太复杂’了。即使我上面介绍的资源模板已 经为美工人员考虑的比较周到了,但还是会有一部分人心里会觉得不舒服。 我虽然是仁慈的,但‘现实’却是残酷的,这句话的意思是说:不使用循环语句,你将无法批量输出。你 一定会表示同意。但你依然会争辩说:“为什么不可以在html文件中把批量输出的部分用一个变量来代替 ,然后在php中为这个变量赋值呢?例如一个表格的填充,在PHP文件中生成表格不就得了”。 你当然可以那样做,但你却违背了“可预先预览”的原则。表格的字段名称最好是在html中能够直接显示 出来,以便能够更加直观的反映网页的输出目标和意图。 所以请你不要介意在html文件中插入的少许控制流程的PHP代码。 但基于MVC的要求,html文件中不应该存在数据分析和处理的代码(例如连接数据库),换言之html模板文 件只负责“显示逻辑”,而不要管其他任何事情。当然在简单的应用中,你可以使用‘simple view’, 里面的PHP代码就最少,往往只有一个'heredoc'。 诚如‘小员’所说:“PHP最好的模板语言就是PHP本身”。而‘PHP资源模板’可以说是很好的贯彻了这 个思想。不但如此,更是巧妙的实现了“模板引擎四项原则”,可以说是‘前无古人,后无来者。念天地 之悠悠,独苍然而泣下’——不要误会,那是‘高兴的眼泪’。 所以不管是简单还是复杂,PHP资源模板都是最棒的,它就是传说中的‘模板终结者’,“只要有了它, 你的一生都会改变,在你使用它之前,我要提醒你,尘世间的任何其他模板,你都无须再有半点留恋。” “曾经有一份珍贵的模板摆在我的面前,我没有珍惜;直到别人都在用了,我才后悔莫及! 如果上天能再给我一次机会,我会对这个模板说三个字--我用你。如果要问我用多久,我希望是 --一万年。” 附:《资源模板演示文档》

Download attachment
assets.zip ( 下载次数: 226 )

PHP资源模板——模板终结者相关推荐

  1. WPF XAML 资源样式模板属性存放位置

    WPF XAML 资源样式模板属性存放位置 原文:WPF XAML 资源样式模板属性存放位置 WPF的XAML 资源申明 类似HTML. 整体来说分3种 1.行类资源样式属性 1.1 行内属性 < ...

  2. 19年8月 字母哥 第五章 静态资源与模板引擎的整合 用热点公司网不行

    第五章 静态资源与模板引擎的整合 5.1.webjars与静态资源 5.2.模板引擎选型与未来趋势 5.3.web应用开发之整合jsp 5.4.web应用开发之整合freemarker 5.5.web ...

  3. 新版仿小刀资源网模板—木鱼cms

    介绍: 仿小刀资源网模板新鲜出炉,使用的是muyucms 仿小刀资源网页面 1比1还原 这套模板使用了全新的轻量cms系统 木鱼cms 网盘下载地址: http://kekewl.net/38Bsc8 ...

  4. 苹果CMS10 资源网模板

    简介: 苹果CMS10 资源网模板自适应 用来做资源采集网,比较老款的模板也在用 纯模板无数据 这模板网上也有几个但是都是要你几个金啥的才能下载 多麻烦啊 网盘下载地址: http://zijieyu ...

  5. 资源网站模板Emlog程序zytheme模板

    资源网站模板Emlog程序zytheme模板 Emlog程序zytheme资源网模板免费版 资源网zytheme模板是由@思源 开发的Emlog模板,使用了最新的界面,模板与小刀娱乐网和QQ皇族馆以及 ...

  6. emlog轩少资源网模板,整站数据源码

    简介: emlog5.3.1版本,高仿轩少资源网模板,带整站数据打包. 网盘下载地址: http://kekewl.net/nShszqYyUrY0 图片:

  7. emlog仿某枫资源网模板源码

    介绍: 此模板是仿emlog某枫资源网模板源码 一比一精仿 基本都一样 网盘下载地址: http://kekewl.org/R6izU3JStfG 图片:

  8. 苹果cms V10模板 黑色资源站模板

    简介: 苹果cms V10模板 黑色资源站模板 网盘下载地址: http://kekewl.org/cjF7JV9BTWn0 图片:

  9. C++模板——模板特化、分离编译

    这里写目录标题 一.泛型编程与模板 二.函数模板 1.概念 2.原理 3.函数模板的实例化 3. 模板实现复数类的加法 4.模板参数的匹配原则 三.类模板 1.定义格式 用类模板实现顺序表 2.非类型 ...

最新文章

  1. 2021年大数据ELK(七):安装Elasticsearch-head插件
  2. BZOJ5329: [SDOI2018]战略游戏——题解
  3. Linux服务管理---系统运行级别、rpm启动与自启动、源码包的启动...
  4. PXE批量部署linux操作系统
  5. 计算机硬件常见问题及修复,pc机输入输出设备的常见故障现象及故障修复方法...
  6. stand up meeting 12/25/2015 weekend 12/26/2015~12/27/2015
  7. nginx 配置文件nginx.conf结构
  8. 共享几套silverlight2 toolkit最新的皮肤控件样式下载
  9. Delphi获得计算机系统配置,用Delphi获取本地计算机名称和IP地址
  10. 美图回应meitu商标纠纷:不影响主营业务 社交业务商标完备
  11. Guava CaseFormat
  12. 罗马仕php30重量,认真测评 篇三:罗马仕sence8P+两年使用报告
  13. Ubuntu18.04中FFmpeg推流环境搭建
  14. Matlab 边界提取
  15. MVCC(多版本并发控制)原理
  16. 01 unity初识和素材导入
  17. IEEE 802.2 LLC协议
  18. MapGIS 的一些小总结
  19. MTK平台TP驱动详解
  20. Java AQS的实现原理(大部分同步类都依赖AQS实现)

热门文章

  1. 集群01之xshell链接liux 更改ip 网关及dns 主机名称
  2. Java实现基本数据结构(一)——数组
  3. Spark 运行架构与原理
  4. Python基础知识汇总和应用示例
  5. 【求整数 1-100 的累加值,但要求跳过所有个位数为3的数 】
  6. OpenCV GrabCut算法前景分割和提取
  7. 个人网页主页设计(实现三种魔方展示效果)
  8. Matlab一维矩阵无法与三维矩阵进行矩阵乘法?
  9. MATLAB编程实现2FSK信号的调制与解调(非相干解调)
  10. openCV Python基础--镜像翻转和图像旋转