background image

来看看 list.html 可能长什么样子:
XML/HTML 代码
<!–list.html–>
<table>
<?php foreach ($lists as $value) { ?>
<tr>
<td><?php echo htmlspecialchars($value['guest_user_name']);?></td>
<td><?php echo date(’Y-m-d H:i’, $value['guest_date_time']);?></td>
<td><?php echo htmlspecialchars($value['guest_content']);?></td>
</tr>
<?php } ?>
</table>

不难看出来这个文件所做的只不过是遍历留言数组$lists,然后输出每一行的留言,对留
言的内容处理做了 htmlspecialchars 和 date 转换(与显示相关的处理),除了和显示相关的操
作,他没有再做任何业务逻辑了(也不应该有)。

我发现写到这里真的没有什么好写的了,MVC 就是这些(或者再做一些扩展),至于怎么
做到表现和业务分离,那么就是在你的 Model 里只返回数据,也就是你 View 所需要用到
的数据,而你的 View 拿到这些数据后负责去显示他就可以了,不应该在你的 Model 里做
显示和视觉相关的操作,也不应该在你的 View 里做一些业务逻辑相关的操作,把这两者
分清楚,就自然而然的表现与业务分离了。

接下来说说负责 View 的模板引擎吧,其实你在上面应该已经看到了一个最简陋的模板引
擎,那就是 View

 

部分的 require_once 语句。厄,实在是太简单了,模板引擎其实是调度并

 

解析模板的东西,其中调度模板由 require_once 

 

搞定了,那么解析呢?这里由 PHP 引擎

 

本身来搞定了。哈,没错,我一直都认为 PHP 是个最好的模板引擎。

不过还是不得不说说传统的模板引擎的实现原理,一般来说会有这么几个步骤:

1、注册变量,也就是把从 Model 返回的数据注册到模板引擎中,告诉模板引擎这个变量
可以使用,其实所谓的注册也只不过是不得不这么做,因为一般引擎内部函数是没办法
直接访问 Model 返回的变量的(变量作用域的问题),所以不得不加一个注册操作,把这些
变量转换从模板引擎类的属性等。

2

 

、模板解析,就是读取模板文件,按照模板语法将标签解析成 PHP 语法,或者执行一些

替换操作,用变量内容替换掉模板标签,其实效果都差不多。

3、如果不是将变量内容替换掉模板标签,那么基本上第三步就是将注册的变量和解析完
的模板融合在一起输出,类似于上面的 list.html,是个解析完的文件,然后输出。

一般模板引擎还会提供不少用于显示内容处理的插件,比如日期转换、字符串处理、生成
表格、生成 select 等,这些给页面制作提供了一些方便。Smarty 还包含了一些页面缓存机制,
也很不错。