- 浏览: 52702 次
- 性别:
- 来自: 北京
文章分类
道可道,非常道—PHP模板技术
道可道,非常道。
当我第一次见到php模板的时候,简直被迷上了。原来php世界里还有这么好的东西。我疯狂地学习。
好在当时的php模板还不是很庞大,很快我了解了它的原理,并也能自己写一些了。
后来,smarty横空出世,更是拥有了许多为它着迷的fans.许多人开始写模板引擎,将smarty或其他模板加以改造,使之符合自己的需要。
纵观当今模板世界,php模板引擎主要分为两种:
一种是替换特定字串型的。美工做出来的页面,中间会嵌入一些什么{block.title}这样的字符串,然后程序读入这个模板文件,将中间的{block.title}的字样替换成实际从数据库中读取的内容。
还有一种符杂一些,是一种编译型的。以smarty为代表,模板文件中实际上包含了一些简化的php代码,比如有的写的是< {=$site_name}>,<{if $counts>0 }>这样的语句,实际是一种自行定义的语言格式。web开发久的人一眼能看出它们指的是什么。这一类往往会在第一次访问时被预编译,转换成一个 php文件何存起来。比如 <{=$site_name}>就变成了,<{if $count>0 }> 就变成了0) {?>。从第二次起,就直接包含已经编译出来的php文件。当然,各种模板的处理的具体细节不一样。
但是,我们为什么要用模板?
这个问题我也不能很好的回答。但是有很多人这么说:要让美工和程序员的工作分开。要让代码层和表现层分开。
那么我们看这两种方式实现了吗?
让您的美工人员打开一个smarty文件,让他按他的思路去改一下视图设计。他会告诉您,天哪,你怎么把我的设计变成这样一幅样子了?这些foreach,if都是什么意思?噢,天哪,我的表格怎么撑得这么大了?….
原来编译型的模板技术让美工更没法子做美工了。
那么替换字符串型的呢?看起来是轻松多了。不过您可以测测您的程序速度,看看他是否已经慢了一倍以上。很容易,您用了太多的有preg_match,或是 str_ireplace之类的语句来替换。程序重复一次又一次在您那几万个甚至更多字节的模板文件中查找某个字串,来替换内容。
不仅如此,你还发现您哪天想在视层面插一点东西时,处处受制于模板。您肯定很想直接在模板中写一段之类的语句,但是,很抱歉,您不能这么写。如果只是想echo 一个什么东西,您可以在模板中加一个{{var}}的串,然后在php程序中写
$var=”这一个串”;
$template->assign(”var”,$var);
但是如果您不是想输出呢,想做其他操作?抱歉,您还是得改php代码。这些模板都支持规矩矩的表格状的输出,但是,如果我想输出20条记录,我要弄一个第一行2列记录的,第二行3列的,第三行又是2行的之类的,或者是其他类似找码,您打算怎么办?
难道再让您的模板引擎也升级成为编译性的,好让您往您的模板中加入php语句?
您错了。其实,我们看一看,我们的模板引擎充当了什么样的角色呢?我们把一段特定的按一定规则编写的html代码进行一定的数据处理后输出成了另外一段,输出过程中某些字符发生了改变。那我们的伟大的php干了什么呢?它帮我们把我们按规则写好的php代码也按一定规则输出成了一段html。两者本质是一样的。只是,php本身比我们那些蹩脚的模板引擎更快,更漂亮。
再说细一点,现在用的最多的Smarty.看一看它的结构:
1. <{if $article.rates}>
2. <span class="title"><{php}>echo art_constant("MD_RATE");<{/php}>:</span>
3. <span class="item"><{$article.rating}>/<{$article.rates}></span>
4. <{/if}>
你觉得它是一个美工能看清的html文件么?
看看编译后的结果,它看起来应该是这样的:
1. <?php
2. if($articles.rates){
3. ?>
4. <span class="title"><?php echo art_constant("MD_RATE");?>:</span>
5. <span class="item"><?php echo $article.rating;?>/<?php echo article.rates;?></span>
6. <?php
7. }?>
哈。我们伟大的smarty把这html也变成了php了。然后在以后的工作中,这些php代码会直接被运行。
有必要吗?本来是apache承载php,php直接编译php 源代码,现在变成了apache承载php,php编译smarty引擎,smarty引擎又去编译html文件。反而多了一层,smarty自个儿把本来php要做的工作拿了做了。
而且糟糕的是,smarty的模板打开来以后,比php文件更让人难以看清。
所以我说,放弃您的模板系统吧。但记住我们开发模板系统的初衷。
您会说:那要是放弃模板系统了,我怎么分开程序逻辑和视图层面?
这个也太好办了。您可以这样写:
第一个文件这样写:
1. <?php
2. /**
3. file :logic.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. $rs=mysql_query("select id,title,body from articles order by id desc limit 30");
8. while($row=$mysql_fetch_assoc($rs))
9. {
10. $rows[]=$row;
11. }
12. ?>
第二个文件作为您的视层面的文件。您可以让您的平面设计师在mac上设计漂亮绝顶的图片,然后切成html文件,交给您的页面整合工程师。这个工程不需要懂太多php,他基本上只需要会用print就行了。他把这个html文件改名为view.php,然后在里面加上相应代码:
1. <?php
2. /**
3. file:view.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. foreach($rows as $row)
8. {
9. echo "<tr>";
10. echo "<td>";
11. echo $row["id"];
12. echo "</td>";
13. echo "<td>";
14. echo $row["title"];
15. echo "</td>";
16. echo "</tr>";
17. }
18. ?>
ok.这就视层面文件。这个文件用织梦者(dreamweaver)打开后,应该跟美工做出来的图是一样的,就仅仅多了用那个黄色的问号代表的php代码。写得好时,dreamweaver还能列出您的php代码中输出了什么内容,效果更佳。
这两个文件,就是一个是逻辑层,一个是视层面。
然后用index.php将他们包含起来。
1. <?php
2. /**
3. file:index.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. include "databaseConnect.php";//连接数据库的代码,我就不写了
8. include "logic.php";
9. include "view.php";
10. include "cache.php";
11. ?>
这样逻辑和视,就分开了。那有人会说,如果我用模板,可以将要输出的内容写入到静态文件中,现在没了模板我该怎么办?
这个不是问题。我们用的是php,超酷的php.
看看,我们加了cache.php.这就是用来实现您说的缓存效果的。
我们的cache文件:
1. <?php
2. /**
3. file:cache.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. $content=ob_get_content();
8. $fp=fopen("index.html","w");
9. fwrite($fp,$content);
10. fclose($fp);
11. ?>
当然,index.php也改成:
1. <?php
2. /**
3. file:index.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. if(file_exists("index.html"))
8. {
9. include "index.html";
10. exit();
11. }
12. include "databaseConnect.php";//连接数据库的代码,我就不写了
13. include "logic.php";
14. include "view.php";
15. incldue "cache.php";
16.
17. ?>
这样您看这缓存效果是不是就出来了?
有人说:我用模板还有一个好处啊,就是模板写错了还不会影响到程序的运行。是的。咳,怎么说呢?您在模板中将<{=$site_name}& gt;写成了<{=$sie_name}>是没啥,您的php程序还是很”健壮”地运行着。不过您没觉得,当您期望的那一个将由& lt;{=$site_name}>来打出来的网站名称没有出现的时候,您排起错来会很难找吗?对于一个程序师来说,您不觉得,光只视层面的那些 echo语句,只应该是您工作中极微不足道的一部分吗?在这个主要是echo语句构成的视层面文件view.php,您还出现编译期错误,是不是该拉出去打屁屁?
另外,在php程序正式上线运行时,您也可以将它的报错功能关闭啊。
常道,亦非常之道。
无为,无所不为。
道可道,非常道。
当我第一次见到php模板的时候,简直被迷上了。原来php世界里还有这么好的东西。我疯狂地学习。
好在当时的php模板还不是很庞大,很快我了解了它的原理,并也能自己写一些了。
后来,smarty横空出世,更是拥有了许多为它着迷的fans.许多人开始写模板引擎,将smarty或其他模板加以改造,使之符合自己的需要。
纵观当今模板世界,php模板引擎主要分为两种:
一种是替换特定字串型的。美工做出来的页面,中间会嵌入一些什么{block.title}这样的字符串,然后程序读入这个模板文件,将中间的{block.title}的字样替换成实际从数据库中读取的内容。
还有一种符杂一些,是一种编译型的。以smarty为代表,模板文件中实际上包含了一些简化的php代码,比如有的写的是< {=$site_name}>,<{if $counts>0 }>这样的语句,实际是一种自行定义的语言格式。web开发久的人一眼能看出它们指的是什么。这一类往往会在第一次访问时被预编译,转换成一个 php文件何存起来。比如 <{=$site_name}>就变成了,<{if $count>0 }> 就变成了0) {?>。从第二次起,就直接包含已经编译出来的php文件。当然,各种模板的处理的具体细节不一样。
但是,我们为什么要用模板?
这个问题我也不能很好的回答。但是有很多人这么说:要让美工和程序员的工作分开。要让代码层和表现层分开。
那么我们看这两种方式实现了吗?
让您的美工人员打开一个smarty文件,让他按他的思路去改一下视图设计。他会告诉您,天哪,你怎么把我的设计变成这样一幅样子了?这些foreach,if都是什么意思?噢,天哪,我的表格怎么撑得这么大了?….
原来编译型的模板技术让美工更没法子做美工了。
那么替换字符串型的呢?看起来是轻松多了。不过您可以测测您的程序速度,看看他是否已经慢了一倍以上。很容易,您用了太多的有preg_match,或是 str_ireplace之类的语句来替换。程序重复一次又一次在您那几万个甚至更多字节的模板文件中查找某个字串,来替换内容。
不仅如此,你还发现您哪天想在视层面插一点东西时,处处受制于模板。您肯定很想直接在模板中写一段之类的语句,但是,很抱歉,您不能这么写。如果只是想echo 一个什么东西,您可以在模板中加一个{{var}}的串,然后在php程序中写
$var=”这一个串”;
$template->assign(”var”,$var);
但是如果您不是想输出呢,想做其他操作?抱歉,您还是得改php代码。这些模板都支持规矩矩的表格状的输出,但是,如果我想输出20条记录,我要弄一个第一行2列记录的,第二行3列的,第三行又是2行的之类的,或者是其他类似找码,您打算怎么办?
难道再让您的模板引擎也升级成为编译性的,好让您往您的模板中加入php语句?
您错了。其实,我们看一看,我们的模板引擎充当了什么样的角色呢?我们把一段特定的按一定规则编写的html代码进行一定的数据处理后输出成了另外一段,输出过程中某些字符发生了改变。那我们的伟大的php干了什么呢?它帮我们把我们按规则写好的php代码也按一定规则输出成了一段html。两者本质是一样的。只是,php本身比我们那些蹩脚的模板引擎更快,更漂亮。
再说细一点,现在用的最多的Smarty.看一看它的结构:
1. <{if $article.rates}>
2. <span class="title"><{php}>echo art_constant("MD_RATE");<{/php}>:</span>
3. <span class="item"><{$article.rating}>/<{$article.rates}></span>
4. <{/if}>
你觉得它是一个美工能看清的html文件么?
看看编译后的结果,它看起来应该是这样的:
1. <?php
2. if($articles.rates){
3. ?>
4. <span class="title"><?php echo art_constant("MD_RATE");?>:</span>
5. <span class="item"><?php echo $article.rating;?>/<?php echo article.rates;?></span>
6. <?php
7. }?>
哈。我们伟大的smarty把这html也变成了php了。然后在以后的工作中,这些php代码会直接被运行。
有必要吗?本来是apache承载php,php直接编译php 源代码,现在变成了apache承载php,php编译smarty引擎,smarty引擎又去编译html文件。反而多了一层,smarty自个儿把本来php要做的工作拿了做了。
而且糟糕的是,smarty的模板打开来以后,比php文件更让人难以看清。
所以我说,放弃您的模板系统吧。但记住我们开发模板系统的初衷。
您会说:那要是放弃模板系统了,我怎么分开程序逻辑和视图层面?
这个也太好办了。您可以这样写:
第一个文件这样写:
1. <?php
2. /**
3. file :logic.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. $rs=mysql_query("select id,title,body from articles order by id desc limit 30");
8. while($row=$mysql_fetch_assoc($rs))
9. {
10. $rows[]=$row;
11. }
12. ?>
第二个文件作为您的视层面的文件。您可以让您的平面设计师在mac上设计漂亮绝顶的图片,然后切成html文件,交给您的页面整合工程师。这个工程不需要懂太多php,他基本上只需要会用print就行了。他把这个html文件改名为view.php,然后在里面加上相应代码:
1. <?php
2. /**
3. file:view.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. foreach($rows as $row)
8. {
9. echo "<tr>";
10. echo "<td>";
11. echo $row["id"];
12. echo "</td>";
13. echo "<td>";
14. echo $row["title"];
15. echo "</td>";
16. echo "</tr>";
17. }
18. ?>
ok.这就视层面文件。这个文件用织梦者(dreamweaver)打开后,应该跟美工做出来的图是一样的,就仅仅多了用那个黄色的问号代表的php代码。写得好时,dreamweaver还能列出您的php代码中输出了什么内容,效果更佳。
这两个文件,就是一个是逻辑层,一个是视层面。
然后用index.php将他们包含起来。
1. <?php
2. /**
3. file:index.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. include "databaseConnect.php";//连接数据库的代码,我就不写了
8. include "logic.php";
9. include "view.php";
10. include "cache.php";
11. ?>
这样逻辑和视,就分开了。那有人会说,如果我用模板,可以将要输出的内容写入到静态文件中,现在没了模板我该怎么办?
这个不是问题。我们用的是php,超酷的php.
看看,我们加了cache.php.这就是用来实现您说的缓存效果的。
我们的cache文件:
1. <?php
2. /**
3. file:cache.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. $content=ob_get_content();
8. $fp=fopen("index.html","w");
9. fwrite($fp,$content);
10. fclose($fp);
11. ?>
当然,index.php也改成:
1. <?php
2. /**
3. file:index.php
4. @author renlu xu<helloasp@hotmail.com>
5. @link http://www.162cm.com
6. */
7. if(file_exists("index.html"))
8. {
9. include "index.html";
10. exit();
11. }
12. include "databaseConnect.php";//连接数据库的代码,我就不写了
13. include "logic.php";
14. include "view.php";
15. incldue "cache.php";
16.
17. ?>
这样您看这缓存效果是不是就出来了?
有人说:我用模板还有一个好处啊,就是模板写错了还不会影响到程序的运行。是的。咳,怎么说呢?您在模板中将<{=$site_name}& gt;写成了<{=$sie_name}>是没啥,您的php程序还是很”健壮”地运行着。不过您没觉得,当您期望的那一个将由& lt;{=$site_name}>来打出来的网站名称没有出现的时候,您排起错来会很难找吗?对于一个程序师来说,您不觉得,光只视层面的那些 echo语句,只应该是您工作中极微不足道的一部分吗?在这个主要是echo语句构成的视层面文件view.php,您还出现编译期错误,是不是该拉出去打屁屁?
另外,在php程序正式上线运行时,您也可以将它的报错功能关闭啊。
常道,亦非常之道。
无为,无所不为。
发表评论
-
php-APC介绍
2008-07-27 19:53 19826前面几篇文章提到了APC. ... -
利用web应用中的不均衡性重构你的技术细节
2008-07-27 19:53 1188前提: Lamp架构 1.用户对 ... -
把握web 开发的平衡与不平衡
2008-07-27 19:52 1023a.web开发服务的对象是 ... -
php高手之路之—返樸归真
2008-07-27 19:50 1648武侠小说里常写,无招胜有招.大师们最终都要精通十八门武艺,然后 ... -
php高手之路之—绝世秘籍
2008-07-27 19:50 1694PHP有秘籍吗? 有.PHP手册. 不信,您问问其他人.我问了 ... -
php高手之路之—屠龙宝刀
2008-07-27 19:49 1498不知道各位看官都使用什么工具来进行PHP文件编写工作呢. 很多 ... -
php高手之路之—万人之术
2008-07-27 19:49 1162我曾经遇到这样一名求 ... -
php高手之路之—纵横天下
2008-07-27 19:48 1409想想,当您感觉到自己的已经非常牛X的时候,肯定想着自己写一个w ... -
PHP高手之路之—折柳为剑
2008-07-27 19:47 1251hp只可以做网站吗?NO! 我上talks.php.net,发 ... -
php高手之路之—狐假虎威
2008-07-27 19:47 1032首先要告诉你:如果要成为php高手,一定要学会用linux(U ...
相关推荐
奢侈品营销策略—道可道 非常道 在当今商业社会,奢侈品市场一直是众多品牌争夺的宝地,它们之所以能吸引全球范围内的消费者,除了价格昂贵外,更多的在于其背后的独特文化、名人效应以及对细节品质的执着追求。...
随着技术的不断进步和网络空间的日益复杂,网络安全问题愈发凸显其重要性。国家信息技术安全研究中心总工程师李京春先生的访谈为我们提供了关于工控安全、关键基础设施保护以及安全审查等多方面的重要见解和建议。 ...
在此背景下,制造业面临转型升级,那些技术领先、有国际竞争力和规模优势的企业有望脱颖而出。 报告强调,过剩经济状态下,产业链的上游生产要素(如人力、土地、原料、能源)和下游服务业(如港口、机场、零售连锁...
在内容方面,PPT古风模板大量引用了《道德经》中的经典语句,如“道可道,非常道;名可名,非常名”等,不仅赋予模板深厚的文化底蕴,还使人在欣赏视觉设计的同时,能够接触到中国古典文化的哲学智慧。《道德经》是...
4. **道可道,非常道;名可名,非常名**:这是《道德经》开篇的名句,指出道的真理无法用言语完全表达,名字只能暂时指代,而非固定不变。在PPT设计中,这可能意味着设计者试图通过非文字的方式,如图像、符号,来...
《道德经》开篇中的名句“道可道,非常道;名可名,非常名”,更是引人深思。它告诉我们,真正的道理往往是超越语言的,真正的智慧往往是无法用言语表达的。在许多场合中,这份模板鼓励演讲者和听众一起超越表面的...
他著有《道德经》,提出了“道可道,非常道”等一系列关于“道”的深奥哲理,尊道贵德,从而开创了古典道教。这一时期的道教,通过关尹子、列子、庄子等人的传承,逐渐在社会中产生了广泛的影响。 【道教的宗派与...
《道德经》中提到“道可道,非常道”,说明“道”是超越常规认知的。将这一思想应用在需求分析中,意味着开发者需要超越客户的表面需求,深入探究其内在的“道”,即真正的需求。这需要开发者进行更深层次的沟通和...
没用过积分,所以设置为1 吧 ...道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门
道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在项目中的应用经历拿出来和大家共享,却总是下不了这个决心:GoF的23种模式研读、总结也总需要些时日,然而时间对于我来说总是不可预计的
2. **道家** - 老子(LAO ZI):道家的代表人物,著有《道德经》,提出了"道可道,非常道"的概念,强调顺应自然,无为而治,以及知足常乐的生活态度。 3. **墨家** - 墨子(MO ZI):墨家的创始人,他主张兼爱非攻...
《道德经》中提到“道可道,非常道”,意味着真正的大道难以用言语表达,提倡无欲观妙,有欲观徼,揭示了宇宙万物的奥秘。 3. **墨家** - 墨子(MO ZI):墨家重视实践和实用主义,主张兼爱非攻。认为治理国家应...
老子曰:「道可道非常道,名可名非常名 無名天地之始,有名万物之母。故常无,欲以观其妙;常有,欲以观其徼。」 在这里,老子提到了「道」的概念,认为「道」是宇宙的本源,它创造了万物,但又超越于万物之外。...
文章引用了老子《道德经》的经典开篇语“道可道,非常道”,并结合现代考古发现,提出了一种新的解释:“道,可道,非常道”,即“道”、“说得道”和“永恒道”。这三种智能分别对应算法智能(AI)、语言智能(LI)...
设计模式C++ 实现 懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 可以作为入门教程
懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此
道可道,非常道。道不远人,设计模式亦然如此。 设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),...
懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成 立。道可道,非常道。道不远人,设计模式亦然如此。
“中国风”部分引用了道家经典《道德经》的片段,体现了中国传统文化的哲学思想,如“道可道,非常道;名可名,非常名”。这可能用于阐述项目或策划中融入中国元素的理念,或者用于探讨传统文化与现代设计的结合。 ...
道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在项目中的应用经历拿出来和大家共享,却总是下不了这个决心:GoF的23种模式研读、总结也总需要些时日,然而时间对于我来说总是不可预计的...