PHP:MVC迷思

转载 2006年06月08日 14:06:00
近来设计模式风行,MVC随处可见,PHP领域也不例外,很多论坛都开始讨论在PHP中使用MVC。然而,M、V、C在PHP中到底该如何实现?MVC真的适合PHP么?这里Easy给出一些自己的思考。


MVC的原型

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架构可以用下图来表示。

Click to fullsize



然后我们再来看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:MVC迷思

PHP:MVC迷思作者:EasyChen 来源:超越PHP 近来设计模式风行,MVC随处可见,PHP领域也不例外,很多论坛都开始讨论在PHP中使用MVC。然而,M、V、C在PHP中到底该如何实现?MV...
  • bjbs_270
  • bjbs_270
  • 2004年09月26日 17:11
  • 954

PHP:MVC迷思

 近来设计模式风行,MVC随处可见,PHP领域也不例外,很多论坛都开始讨论在PHP中使用MVC。然而,M、V、C在PHP中到底该如何实现?MVC真的适合PHP么?这里Easy给出一些自己的思考。MVC...
  • KBUG
  • KBUG
  • 2004年04月05日 22:57
  • 1547

MVC的迷思

  这个贴子是从“代码擂台”转过来的。我想专门讨论一下这个问题。MVC的概念已经深入人心,是经常被大家经常提到的法宝利器。 我感到有必要澄清MVC的概念和来龙去脉,以便大家有一个共识,有一个共同...
  • kjfcpua
  • kjfcpua
  • 2009年11月26日 20:44
  • 343

php中实现MVC的思想

什么是MVC? 简单的说就是将网页源码分类、分层。 MVC三个字母的含义: M:Model 模型,负责数据库操作。 V:View 视图,负责调用Model读取数据,再调用模板,展示出最终效果。...
  • wjc19911118
  • wjc19911118
  • 2011年11月22日 22:15
  • 2047

亚洲货币绞杀战

  90年代初,伦敦-华尔街轴心在东面战线上,重挫了日本经济咄咄逼人的势头,在西面战线上,打垮了东欧和苏联的经济,德法的欧洲统一货币的梦想也随着索罗斯的搅局而暂时搁浅,拉美和非洲早已是囊中之物,志得意...
  • wangchinaking
  • wangchinaking
  • 2008年04月28日 11:46
  • 669

PHP的MVC规范

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。是所有面向对象程序设计语言都应该遵守的规范。   M(model...
  • L1837435964
  • L1837435964
  • 2016年10月10日 15:55
  • 391

php mvc分页主代码

class Page{ private $total; private $page; private $num; private $pageNum; private $offset; ...
  • qoubter
  • qoubter
  • 2011年11月14日 20:59
  • 852

基于MVC设计模式实现简单PHP框架(雏形)-初期

(记住:这里只是提供思考的过程)        其实这里只是一个我们课的Web实验”课程设计题目统计系统“,在做实验的过程中起初只是想往MVC靠拢而已,却不知不觉地“实现”了基于MVC的简单框...
  • qq_15096707
  • qq_15096707
  • 2016年04月22日 21:38
  • 2261

【PHP】简单的MVC实例

总结的来说就是,用户通过入口文件访问控制器,控制器访问模型获取数据,最后将数据显示在视图中反馈给用户。...
  • u013578500
  • u013578500
  • 2016年02月27日 13:45
  • 1308

PHP之MVC学习

PHP之MVC学习总结
  • liujie19901217
  • liujie19901217
  • 2016年05月22日 21:01
  • 1118
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP:MVC迷思
举报原因:
原因补充:

(最多只允许输入30个字)