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

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

WBOY
WBOYOriginal
2016-06-23 13:54:361491browse


这个帖子送给那些被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 为什么会这么难

<?php//文件地址:D:\zbphp.com\www\Lib\Action\MemberAction.class.phpclass MemberAction extends Action {    public function index(){        $this->display();    }    public function login(){        $this->display();    }    public function register(){        $this->display();    }}

每次看到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架构
<?php//文件 D:\zbphp.com\www\Lib\Controller\MemberController.class.phpclass MemberController extends Controller {    //访问地址 index.php?c=Member&a=index    public function indexAction(){        $this->display();    }    //访问地址 index.php?c=Member&a=login    public function loginAction(){        $this->display();    }    //访问地址 index.php?c=Member&a=register    public function registerAction(){        $this->display();    }}



写在最后

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






回复讨论(解决方案)

大神 怎么看待zf啊 

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

其实认真看一下开发手册就都知道了,何苦要花4年时间?

愿楼主珍重

愿楼主珍重


谢谢!

称为 Action 而不是 Controller 是有道理的
Action 基类 完成了 Controller 的工作
而派生于 Action 的类完成的是  Model (业务模型)的工作
而 Model 类只是数据表的映射
其实认真看一下开发手册就都知道了,何苦要花4年时间?



学习了,原来如此。不过如果命名为Controller确实好理解一下。一开始就把m a 往Action.Class 和Model.class上想,所以导致一直都搞不懂ThinkPHP mvc。

有这么难理解吗?


?然菊花一?,但是我?是???主?於通?而感到欣慰。
???短不要?,重要的是你?於悟出?了

思想和框架是两个东西,思想要有,框架不一定要用。

一直觉得ThinkPHP是工厂模式。

主要还是因为,thinkphp是“借鉴”SSH,在SSH里面的MVC就是这样命名的。

主要还是因为,thinkphp是“借鉴”SSH,在SSH里面的MVC就是这样命名的。



今天重新看了一遍,大概的看懂了。不过分布式构架、HTTPSQS、sphinx 这些没用过。
电脑配置太低了,装IDE都CPU 100%

你搞错了,thinkphp 2.x 也就是你说的什么action的,是最清晰的,代码也是最易懂得
现在的thinkphp 3.x,反而变得复杂不易懂了。

一直觉得ThinkPHP是工厂模式。


为啥这么觉得!

其实地址中的m是模块module a是方法action
模块和方法同时定位某个控制器方法,所以说module+action=controller 即地址中m+a=c
而MVC中的m是模型model ,不能用地址来调用,必须系统内部调用的...
你要怪得怪模块和模型的英文都是m开头产生了混淆...

这样说应该清楚明白了:
mvc = model + view + controller
controller = module + action

确实很多东西需要悟

这样子搞 。让我们新手怎么活呢?

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
Previous article:ftp_put 路径问题Next article:使用phpexcel导出excel乱码