简述MVC思想与PHP如何实现MVC
我相信已经有很多这样的文章了但是我今天还是愿意把自己的经验与大家分享一下纯属原创我也没什么保留希望对新手有帮助有说的不对的地方也欢迎指出
什么是MVC?
简单的说就是将网站源码分类分层
MVC三个字母的含义
MModel 模型负责数据库操作
VView 视图负责调用Model调取数据再调用模板展示出最终效果
CController 控制器程序的入口决定改调用哪个View并告诉View该做什么
如此说来程序的执行顺序是CVM 或 CM 和MVC的名字正好相反
为什么要MVC?
能使网站程序物理结构更合理
当用PHP建设一个网站的时候最笨的方法你可能把每个页面建成一个PHP文件如果你的网站只有indexphpmenuphparticlephp 三个页面那你可以不用MVC但我们做一般的网站的时候动辄几十个页面把所有页面放在根目录显然不是我们所能接受的于是你需要一个合理的思想去将你的代码分类按功能把他们分成不同的目录且由程序智能的载入调用这就是MVC要帮助你做的
使代码更容易维护
我们再来看单个页面最笨的方法就是PHP代码与HTML代码混合这显然不够好你在维护网站的时候不得不区分哪里是PHP哪里是HTML这对于一个程序员来说简直只灾难于是很多人就使用Smarty这样就可以将“数据处理”与“页面展示”分开来这样做的确不错也有很多人正在这么做但这还不是MVCMVC要做的就是将“数据处理”再分为“逻辑处理”与“数据库操作”这就是所说的分层
这样当你的程序错误或想要修改的时候就变得很轻松了当页面显示错误的时候你就去检查V或模板文件当逻辑有问题的时候你就去检查C和V当你数据库操作错误就去检查M
其实MVC一般要把PHP的一个页面分割为个页面分别是CVM模板各司其职方便管理
有利于代码复用
MVC会把一般会把一个大的功能放在一个目录下也就是由一个C去管理
例如要做一个含有会员系统的网站我们就可以把会员相关的代码都放到user目录里由User_Controller统一管理当我们另一个网站也需要会员系统的时候我们就可以直接把这个目录复制过去修改一下接口就可以了
PHP实现MVC的思路
我们需要三个基类ControllerViewModel 然后不同的CVM分别继承他们就有对应的属性与方法了如果这里你不理解可以去看看面向对象的书
我给大家提供一种MVC基类的设计思路仅供参考
Controller类的设计
一个main()方法供程序调用主要是通过get和post变量决定该如何处理
一个getModel($model)方法在需要调用数据库的时候调用对应目录的M
一个display($view)方法在main()方法中调用载入对应的V并掉应V的main()方法
View类的设计与Controller很相似
一个main()方法当C载入V的时候调用这个方法使程序能继续执行下去
一个getModel($model)方法在需要调用数据库的时候调用对应目录的M
一个display($template)调用对应的模板文件并把数据传递给模板
Model类的设计
可以定义一些属性例如要操作那些表操作那些字段等
一个getDB()方法获得一个数据库类的实例(数据库类一般都是用单件模式设计的)
一个load()方法载入一个数据
一个add()方法可以根据定义好的属性自动构造SQL语句并执行插入操作
一个eidt()方法同上但执行修改操作
一个del()方法同上但执行删除操作
为了能使新手更好的理解我这个思路的工作原理我们现在模拟一个用户登录的场景看看MVC是如何工作的
现在假设所有的数据都提交给indexphp
第一步
我们提交各get变量告诉indexphp该用哪个C例如可以这样indexphp?controller=user
然后index接收到get变量什么也不需要做直接找到/user/controllerphp把所有数据丢给他本来GET和POST就是全局的所以indexphp也不需要做什么直接调用C的main函数就可以了到此indexphp的任务完成
第二步
C的main函数开始执行检查变量发现用户要执行的登录操作(很简单你post个变量do=login就可以了)于是调用getModel载入对应的M类(例如/user/models/modelphp)并实例化 调用实例的load方法载入该用户的数据资料判断是否与用户提交的密码一致如果提交的数据不正确header跳转到出错页面如果正确调用display()方法载入对应的V(例如/user/views/detailsphp)并实例化调用其main()函数进入第三步到此C的任务已完成第二不操作均在main函数中进行
第三步
你可以选择调用getModel()载入M重写调取数据也可以在C实例化V的时候把参数传过来(例如SESSION)当V已经确定得到数据以后display()载入模板MVC执行完毕
当然由于字数与精力限制这里写的只是非常简要的概括实际实施的时候要考虑很多细节但我设计MVC的时候大概思路就是这样也用到了实际中感觉良好
这篇文章不算软文写都是实际的东西希望对新手有帮助如果你读不懂对不起我文笔有限