PHP:MVC迷思
近来设计模式风行,MVC随处可见,PHP领域也不例外,很多论坛都开始讨论在PHP中使用MVC。然而,M、V、C在PHP中到底该如何实现?MVC真的适合PHP么?这里Easy给出一些自己的思考。
MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
JAVA中的MVC
JAVA把MVC引入了Web领域,并在此基础上架构出了一套称为Model2的体系。由于Web的特殊性,JAVA中的MVC和Desktop中的MVC并不完全一致。主要原因是Web中的V不是持续的,用户每访问一次,V就要重新生成一次,所以V始终是和M一致的,不需要C来控制同步。那么JAVA中的C在干什么?JAVA中的C通常用于流程的转向,其实用的是Dispatch模式,不再是Desktop中的C了。
PHP中的MVC
要在PHP中原封不动的COPY JAVA的MVC是不可能的。问题主要表现在M上,在JAVA中,M是独立于业务逻辑和表现逻辑的数据模型,在服务器端跨页面存在,JAVA Bean扮演的就是这个脚色。而PHP进程并不长时间驻留于内存,只在PHP页面开始执行时创建,在页面解释执行结束时就已经结束。在这样的情况下,我们根本无法直接实现M。所以所有声称实现了MVC模式的PHP程式都只能通过模拟手段来实现M。实现的方式一般是在当前页面结束前把数据存入数据库或者cookie/session,在下一个页面中再透过数据库或者cookie/session重建M。这样的方式和JAVA中的Bean比起来可以说是开销巨大,本来往内存中写数据的简单操作现在要从服务器端传到客户端或者数据库,然后再传回来。与其用这么大的开销来维护一个数据模型再在最后把这个模型塞回数据库,还不如直接根据需要更新数据库里边的数据。
现在PHP中的MVC架构可以用图一来表示。
然后我们再来看V。现在很多PHP程序简单的使用了一些模板技术就在说明中写“采用MVC架构”。其实绝大多数的PHP模板程序都只是分离HTML和PHP的,而非MVC强调的显示逻辑和业务逻辑分离。一个混用HTML和PHP的页面一样可以是MVC的一部份。如何分离显示逻辑和业务逻辑至今没有一个满意的方案。我个人则比较认同http://www.phpe.net/articles/384.shtml的实现方案。至于C,和JAVA中差不多,还是被用作转向,这个在PHP中其实并不重要。
一个极耗资源的M + 一个区别不大的V + 可有可无的C 构成了PHP中所谓的MVC。
基于以上分析,Easy认为,PHP原有的3层构架比所谓的MVC更为高效,而3层构架中的表现层要解决的问题MVC中的V也同样存在。一个改进后的3层架构比MVC更适用于PHP。
PS:有的方案把业务逻辑并入M中(http://www.phpe.net/articles/382.shtml),这其实是MVC的思想背道而驰的。
- · 用php做一个简单的表单
- · 使用PHP模拟HTTP认证
- · 有关服务器500错误的一些总结--写给新手
- · Whois 的PHP代码
- · php实现ping
- · PHP4调用JavaBean的摸索
- · PHP的content-type=text/html问题
- · 使用PHP的错误处理
- · PHP4的新特性
- · 关于使用文本域(TextArea)的一个问题
- · PHP中如何使用header发送头部信息
- · 如何使用PHP中的字符串函数
- · PHP如何统计在线人数
- · 用PHP处理多个同名复选框
- · PHP中的正规表达式
- · PHP中操作MySQL数据库的一些要注意的问题
- · MySQL数据库结构和数据的导出和导入
- · PHP4连接Oracle 8i的方法
- · PHP中的常量
- · PHP网页计数器的原理
- · PHP中重新定向到另一个页面
- · Apache, PHP在Windows 9x/NT下的安装与配置 (二)
- · Apache, PHP在Windows 9x/NT下的安装与配置 (一)
- · 来自PHP.NET的入门教程
- · 在WIN98下安装PHP4+ PERSONAL ORACLE8I
- · Windows2000下安装Apache PHP4 MySQL
- · Windows 2000下安装PHP4及MySQL大揭密
- · PHP 脚本:随心所欲的代码逐渐流行
- · 用PHP实现标准的IP Whois查询
- · PHP程序员一般都忽略了的几点精华
- · php和asp对象的等价关系
- · PHP巧获服务器端信息
- · PHP的网络资源
- · 初学者认识PHP
- · PHP自动更新新闻DIY
- · 用PHP连mysql和oracle数据库性能比较
- · 用PHP连mysql和oracle数据库性能比较
- · 将PHP作为Shell脚本语言使用
