PHP模板引擎原理
操作方法
- 01
1.模板引擎的由来 模板引擎思想来自于经典的MVC模型,即模型层 - 视图层 - 控制器模型。MVC本来存在于桌面程序中,M指数据模型,V指用户界面,C指控制器。使用MVC的目的是将M和V实现代码分离,从而使同一个程序可以使用不同的表现形式。 随着Web的流行,这一模型被引入Web开发中。此时,V(视图层),也就是通常所说的模板,实现了数据生成和数据展示的分离。早期的视图通常是由html元素控制界面,随着互联网的发展,一些新的表现出技术(例如Flex等)流行起来,MVC使得数据和表现得到分离,一套数据可以用于多种表现层而无需修改逻辑层的代码。例如,可以在M层(模型层)生成博客文章列表的数据,然后可以在传统的Web页面、RIA应用、手机应用中使用不同的表现层技术来展示数据,而不用修改逻辑层的代码,实现前端和后端的分离。 此外,AJAX技术的流行、Jquery库的普遍应用,使早期html、Javascript、PHP代码混写的情况得到改观。AJAX技术的应用使数据的请求和生成、展示实现了分离,促进了表现层(V)和代码层的分离。 模板引擎作为视图层和模型层分离的一种有效解决方案,让前后端更好的分工协作。PHP开发经历了前后端混编,到极力推崇模板引擎(以Smarty为代表),再到如今的回归自然、甚至质疑PHP模板引擎存在的必要性这几个发展阶段。 PHP中到底有没有必要使用模板引擎?模板引擎的原理是什么?为什么Smarty会那么的流行,而如今在PHP社区又引起如此大的争论?这些都是李苦李在接下来的PHP模板引擎的原理与实践系列文章中要讨论的问题。 2.代码分层的思想 PHP作为轻巧灵活的脚本语言,非常适合Web开发这种开发周期短、需求变化快、强调用户体验的需求和业务。PHP早起开发,通常都是PHP代码和HTML混写,代码中到处可见数据库操作、逻辑判断、HTML代码生成,甚至Javascript代码等。对于小型项目,这种编码方式能够很快的完成需求。但是一旦项目扩大后,前端逻辑会越来越复杂,这种完全混写的方式必将造成代码可读性差和后期维护困难等等问题。 在PHP发展初期,我们可能这么写: <html> <head> <meta http-equiv="content-type"content="text/html;charset=utf-8"> <title>最原始的PHP编码风格 - 李苦李</title> </head> <body> <table> <tr> <td>ID</td> <td>姓名</td> </tr> <?php mysql_connect("localhost","admin","password")or die("Could not connect:".mysql_error()); mysql_select_db("user_db"); $result= mysql_query("select id,username from user"); while($row= mysql_fetch_array($result)) { echo"<tr><td>".$row['id']."</td><td>" .$row['username']."</td></tr>"; } mysql_free_result($result); ?> </table> <?php //其他功能模块 ?> </body> </html> 显而易见,对于上述代码无论是在可读性、可维护性还是在代码的复用性上都是极其差的。需要想办法实现数据生成和显示的分离,通常最容易想到的办法就是把和数据库打交道的代码单独放到一个文件中,显示数据的部分放到另一个文件中。新建文件data.php并获取数据,如以下代码所示: <?php mysql_connect("localhost","admin","password")or die("Could not connect:".mysql_error()); mysql_select_db("user_db"); $result= mysql_query("select id,username from user"); while($row= mysql_fetch_array($result)) { $data[] =$row; } mysql_free_result($result); ?> 这两种做法都没有实现PHP代码和HTML代码的分离,但是第二种做法相比第一种做法实现了数据获取和数据展示的分离。在第二种处理方法中,其中一个文件专门负责和数据库交互,获取和处理数据。然后交由另一个文件显示数据,这个负责显示的文件只是进行一些简单的逻辑操作,例如循环、判断、输出等。显然,第二种处理方式比第一种处理方式更加易于维护。 对于第二种处理方式,我们还可以使用HereDoc语法使其更简洁,代码如下所示: <?php foreach($dataas$value) { echo<<< TM <tr><td>$value[id]</td><td>$value[username]</td></tr>; TM; } ?> 第二种处理方式即原生态的PHP模板机制,是当前一些PHP程序所采用的模板机制,特点就是简单灵活、符合PHP的语法和使用习惯、学习成本低。缺点就是不能实现一些高级功能,例如实现可配置化、缓存、使得模板文件脱离PHP语法等等。今天先写到这里,这些问题我们将会在接下来的文章中陆续解决。 文章来源:http://www.likuli.com/single/42