它们在文档中没有意义,它们代表的意义只是PHP将用其他的东西来替换它。 如果你同意这种对视图的松散描述,你也就会同意绝大多数模板方案并没有有效的分离视图和模型。模板标签将被替换成什么存放在模型中。 在你实现视图时问自己几个问题:“全体视图的替换容易吗?”“实现一个新视图要多久?” “能很容易的替换视图的描述语言吗?(比如在同一个视图中用SOAP文档替换HTML文档)” 二、模型(Model) 模型代表了程序逻辑。(在企业级程序中经常称为业务层(business layer)) 总的来说,模型的任务是把原有数据转换成包含某些意义的数据,这些数据将被视图所显示。通常,模型将封装数据查询,可能通过一些抽象数据类(数据访问层)来实现查询。举例说,你希望计算英国年度降雨量(只是为了给你自己找个好点的度假地),模型将接收十年中每天的降雨量,计算出平均值,再传递给视图。 三、控制器(controller) 简单的说控制器是Web应用中进入的HTTP请求最先调用的一部分。它检查收到的请求,比如一些GET变量,做出合适的反馈。在写出你的第一个控制器之前,你很难开始编写其他的php代码。最常见的用法是index.php中像switch语句的结构:
这段代码混用了面向过程和对象的代码,但是对于小的站点来说,这通常是最好的选择。虽然上边的代码还可以优化。 控制器实际上是用来触发模型的数据和视图元素之间的绑定的控件。 这里是一个使用MVC模式的简单例子。 首先我们需要一个数据库访问类,它是一个普通类。
在它上面放上模型。
注意:在模型和数据访问类之间,它们的交互从不会多于一行——没有多行被传送,那样会很快使程式慢下来。同样的程式对于使用模式的类,它只需要在内存中保留一行(Row)——其他的交给已保存的查询资源(query resource)——换句话说,我们让MYSQL替我们保持结果。 接下来是视图(以下代码去掉了html内容)。
最后是控制器,我们将把视图实现为一个子类。
注意:这不是实现MVC的唯一方式——比如你可以用控制器实现模型同时整合视图。这只是演示模式的一种方法。 index.php 文件看起来像这样:
有一些使用控制器的技巧,在PHP中你可以这样做: $this->{$_GET['method']}($_GET['param']); 建议最好定义程序URL的名字空间形式(namespace),那样它会比较规范比如:
通过它可以这样处理控制器:
有时建立控制器并非易事,比如需要在开发速度和适应性之间权衡时。 一个获得灵感的好去处是Apache group 的Java Struts,它的控制器完全是由XML文档定义的。 |