Home >Backend Development >PHP Tutorial >【PHP】MVC框架为何这么难! 4年后终于明白了,被ThinkPHP害得!

【PHP】MVC框架为何这么难! 4年后终于明白了,被ThinkPHP害得!

WBOY
WBOYOriginal
2016-06-13 11:59:422303browse

【PHP】MVC框架为什么这么难!!! 4年后终于明白了,被ThinkPHP害得!!

本帖最后由 default7 于 2014-05-15 18:39:05 编辑
这个帖子送给那些被ThinkPHP命名搞得晕头转向的PHP程序员~(by default7#zbphp.com)


4年前我的几个帖子

帖子1 《跟别人争论PHP中MVC的问题》 http://bbs.csdn.net/topics/350216861
发表于: 2010-12-10 22:38:53 
其实这个帖子当时是使用ThinkPHP,但是运行极为缓慢,且网址怎么都对不上,最后放弃了使用MVC框架!

帖子2 《貌似突然理解了MVC模型》http://bbs.csdn.net/topics/390332774
发表于: 2012-12-29 16:47:22 
这个帖子里面对MVC的理解其错误的,那种方法是工厂模式,并非MVC模式。



PHP MVC真心折磨人啊!!!~

MVC 是Model View Controller的缩写,是一种程序设计方式。可我虽然工作已经有五六年,一直做PHP程序员,但是始终没用过MVC框架更一直被MVC搞的晕头转向。国内MVC框架基本上都是ThinkPHP,很多次找工作,因为不会MVC,因为不用ThinkPHP框架,所以一直碰壁,越来越迷惑 怀疑 不解 抑郁。

这一次再次硬着头皮去理解掌握的心态,重新阅读ThinkPHP框架的官网资料,不过还是很遗憾,网址对应这里仍旧没看懂,越看越晕。不是说MVC吗,为什么没有Controller类? 为什么会出现一个Action类?“控制器”怎么不见了,但是却有一个“Action”? 为什么有“网址参数a”和“参数m”?“参数a”是不是指代“Action类”?“参数m”是不是指代“Model类”??


ThinkPHP 为什么会这么难
<br /><?php<br />//文件地址:D:\zbphp.com\www\Lib\Action\MemberAction.class.php<br />class MemberAction extends Action {<br /><br />    public function index(){<br />        $this->display();<br />    }<br /><br />    public function login(){<br />        $this->display();<br />    }<br /><br />    public function register(){<br />        $this->display();<br />    }<br />}<br />

每次看到ThinkPHP引以为傲的路由网址,就觉得晕!index.php?a=&m=,看到这样的网址,心里就会想“参数a的值”应该是指代“Action类”吧,那数“参数m”应该是指代MVC中的Model吧(模型)?

但是又觉得哪里不对。
Action是动作的意思,MVC是Model View Controller,那么为什么没有看到Controller类?后来仔细看,原来Action在ThinkPHP中就是控制器(但为什么要命名为Action??为什么不直接命名为Controller??)

再来说参数m,一开始理解就是Model类吧。但是更觉得奇怪,比如访问 index.php?a=index&m=content ,那按照这样的思路访问的就是 class IndexAction 下面的 content() 方法,不过很遗憾,错了。他访问的是 class ContentAction 下面的 index()方法。。。

到了这里,你就会明白了为什么ThinkPHP框架会这么难会这么复杂,因为他用了极容易混淆的方式来命名关键部分

害人不浅的ThinkPHP 

写到这里我真的忍不住想说ThinkPHP害人不浅,命名上弄出了
1) 网址参数a和类中的Action;
2) 网址参数m 和类中的Model;
3) 是MVC框架但却用Action类来表示Controller;

由于这三点让绝大多数想弄明白MVC的PHP程序员每次看都是一头雾水!

如果ThinkPHP 这样写,大部分人会立即明白MVC架构
<br /><?php<br />//文件 D:\zbphp.com\www\Lib\Controller\MemberController.class.php<br />class MemberController extends Controller {<br /><br />    //访问地址 index.php?c=Member&a=index<br />    public function indexAction(){<br />        $this->display();<br />    }<br /><br />    //访问地址 index.php?c=Member&a=login<br />    public function loginAction(){<br />        $this->display();<br />    }<br /><br />    //访问地址 index.php?c=Member&a=register<br />    public function registerAction(){<br />        $this->display();<br />    }<br />}<br />



写在最后

最新消息,ThinkPHP 最新版本3.2.x 改正了这几点,Action类改名为Controller。网址中m参数改成了c参,变得直观易懂!
最后感言:几年来一直被MVC困扰,越是去研究ThinkPHP越是觉得一头雾水。一路走来,一路错,还好坚持了,不然真的被搞得彻底放弃了。(欢迎交流 by default7#zbphp.com)






------解决方案--------------------
称为 Action 而不是 Controller 是有道理的
Action 基类 完成了 Controller 的工作
而派生于 Action 的类完成的是  Model (业务模型)的工作
而 Model 类只是数据表的映射

其实认真看一下开发手册就都知道了,何苦要花4年时间?
------解决方案--------------------
愿楼主珍重
------解决方案--------------------
有这么难理解吗?
------解决方案--------------------

雖然菊花一緊,但是我還是認為樓主終於通靈而感到欣慰。
時間長短不要緊,重要的是你終於悟出來了

------解决方案--------------------
主要还是因为,thinkphp是“借鉴”SSH,在SSH里面的MVC就是这样命名的。
------解决方案--------------------
自己简单实现 下MVC整个流程就明白了。
新手也许就3个月一年才能实现。老手实现Thinkphp框架同样功能(mvc主要功能)。也就最多几天或者几个小时。
本php版主估计3小时就足够了吧。
ThinkPHP作者可是php顶尖高手。
ThinkPHP极为简单,而为极为强大,这者作者厉害的地方。
手册也非常完善方便。
------解决方案--------------------
你搞错了,thinkphp 2.x 也就是你说的什么action的,是最清晰的,代码也是最易懂得
现在的thinkphp 3.x,反而变得复杂不易懂了。
------解决方案--------------------
确实很多东西需要悟
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn