近来设计模式风行,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架构可以用下图来表示。然后我们再来看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。------------------------------------
不知道以上说法,是否合理?
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架构可以用下图来表示。然后我们再来看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。------------------------------------
不知道以上说法,是否合理?
解决方案 »
- PHP能调DLL么?
- 问一小段代码的作用(ip地址的值乘以2的N次方)
- fckeditor 上传图片 出现 <img height=\"25\" width=\"110\" alt=\"\" src=\"/UserFiles/dhbg.jpg\" />
- php 4.4下怎么才能支持gd?
- 请大家推荐一个写的比较好的PHP程序,不要太复杂。我研究研究.UP有分
- 怎么做一个登陆。
- 头痛!!unix下装了PHP,可惜没GD图型库,怎么办啊?:(
- 如何得到 SQL 语句
- php 解压缩zip?
- is_executable函數失效问题
- 到这个 write.phh 页面了之后 网页上 点右键 查看源文件 top值 和 level值 是空的
- apache2.2为什么不能启动?
只是目前PHP大多出现的MVC都不是那么理想.
也许是语言特性的限制.
PHP的MVC应该还不是怎么成熟,还有待发展.
MVC 不适合解释型语言
不要为 MVC 而 MVC
mvc.php?cmd=a.b.c,cmd就是个特定参数,对应a模块中的b动作,并且扩展c行为,a + b + c构成M例如用户模块中的注册动作是:
mvc.php?cmd=user.register
而注册下面还延伸一个校验用户名行为,那么就是:
mvc.php?cmd=user.register.verify这些由一个xml或者php数组作为配置,C做的就是把cmd分解了去配置中查找对应项,然后调用动作对应的php文件进行业务逻辑处理,然后C再去配置中查找业务逻辑返回的视图名称对应的php文件,再显示出来,不知道这样理解对不对哦
MVC有歧义 很多的意思 可以是设计上的 也可以是逻辑上的 不知道LZ这里主要指什么 程序的话 PHP貌似真是不适合 因为没有操作的内存(基于文件的session就算了吧) 那横竖都是直接对数据库的CRUD 那倒是真的没有MVC的意义了 逻辑始终还是个增删改查
实现了mvc的php 和java上的struts相比有那些不同?算不算发明轮子
MVC仅仅是一种设计模式,是一个开发方式而已。PHP中的MVC主要是为了将数据处理层、
V => VIEW
C => ACTION (弱化的)
不过我个人直至最终都认为PHP用MVC来弄完全是装逼!!!!!!!!!
一次运行,写的到处都是!代码跟老婆娘的裹脚布一样,又臭又长
MVC用过1回而已,感触不是很深。
我觉得这个东西出发点是好的,不能完全的否认它,很多事情不都是从无到有的么。
大家都是有这么一个希望,能实现一个理想化的MVC,只是就目前来看需要完善的工作还有很多。祝愿能早日完善吧。其次也肯定楼主乐于思考的精神!
因为MC分离我觉得是一个很耗时间的事现在公司都要求快速开发,根本没时间让人去搞那么多东西