深入浅析用PHP实现MVC


Posted in PHP onMarch 02, 2016

在PHP中使用MVC越来越流行了,特别是在一些开源的框架当中。MVC足以应对大多数的情况,但还有一些情况是其不太适合的,如比较简单的个人博客,对于只有几百篇文章量级的博客,使用MVC让人觉得有些太复杂了;同样对于新浪等门户网站,使用MVC,将有大量的文件被加载,对于速度的影响是无法接受的

传统的面相过程式的开发方式在处理中型以上的应用时,就开始显得力不从心。即便我们能够快速的完成需求,但是在需求发生变更后或者进行后期维护的时候,我们会深深地陷入我们早期搭建的陷阱中。所以,使用面向对象的方式来实现MVC模式,将为我们梳理程序的架构提供一个清晰的思路。

什么是MVC?

深入浅析用PHP实现MVC

关于MVC的定义和解释,可以说多种多样。我们可以在Wiki或者[2]中找到更为详尽的解释,这里我并不打算,也没有能力进行深入的讲解,从PHP开发的角度来讲,MVC可以概括为:

视图(The View):

一说到视图,我们很多人都会想到模板引擎(诸如Smarty等等)。其实就是各种各样的输出,比如说html模板和Javascript文件等。

模块(The Model)

模块代表了程序的逻辑,在企业应用中通常称为业务逻辑层。一般来讲,这一层完成的工作是把原始的数据处理成按照我们设计的数据结构存储的有意义的数据序列,并将这些数据交给视图去处理。通常情况下, 模块中会利用一个数据抽象类来进行与数据操作有关的处理。

Model通常包含了哪些用来同数据库打交道的函数。

控制器(The Controller)

控制器使所有WEB应用的第一站,他接受收到的参数,比如$_GET变量,然后做出相应的反应。

关于MVC的是否适合PHP的争论也很多,人们不断的讨论MVC是否适合PHP[3],现在也已经有了很多的MVC框架,诸如PHP MVC Frameworks中列出的[4]。那么,为什么人们这么热衷于MVC,我们为什么要使用MVC在我们的设计中呢。

为什么用MVC?

MVC最早是用来解决桌面GUI的编程问题,最早的MVC框架应该是Sun在1999年提出的Model 2,后来演变成了Struts。MVC带给人们深刻的印象,但是我们在使用的过程中,却并没有认真的想过为什么使用MVC。

在传统的桌面应用中,一旦Model中有时间发生,我们可以主动的让View界面进行刷新,从而展示后台发生的变化。而在Web应用中,我们似乎限于传统的 Http的Request/Response的方式,我们似乎没有办法让用户端进行更新。这一段讨论,并不是认为MVC不能够用来进行WEB应用的开发,而是觉得从某种程度上来说,他还不是最合适的。

关于使用MVC的争论还有很多[1],但是相信所有习惯了使用MVC来组织自己的项目的人,让他选择一个新的项目构架时,一定不会放弃MVC。

如何实现MVC?

下面是一个超级简单的MVC结构实现,甚至连数据源都用了一个内置的固定数组,虽然简单,但其实众多的PHP Framework核心实现的思想应该和这个是差不多的,只不过一些framework提供了更多的方便开发者使用的工具,我也想自己来实现一个PHP的框架,目前正在着手策划中,也希望自己能够从框架的开发中学习到更多的PHP设计思想和方法。

Controller.php

include 'Model.php';
include 'View.php';
class Controller {
private $model = '';
private $view = '';
public function Controller(){
$this->model = new Model();
$this->view = new View();
}
public function doAction( $method = 'defaultMethod', $params = array() ){
if( empty($method) ){
$this->defaultMethod();
}else if( method_exists($this, $method) ){
call_user_func(array($this, $method), $params);
}else{
$this->nonexisting_method();
}
}
public function link_page($name = ''){
$links = $this->model->getLinks();
$this->view->display($links);
$result = $this->model->getResult($name);
$this->view->display($result);
}
public function defaultMethod(){
$this->br();
echo "This is the default method. ";
}
public function nonexisting_method(){
$this->br();
echo "This is the noexisting method. ";
}
public function br(){
echo "";
}
}
$controller = new Controller();
$controller->doAction('link_page', 'b');
$controller->doAction();
==================================
Model.php
class Model {
private $database = array(
"a" => "hello world",
"b" => "ok well done",
"c" => "good bye",
);
//@TODO connect the database
//run the query and get the result
public function getResult($name){
if( empty($name) ){
return FALSE;
}
if( in_array($name, array_keys( $this->database ) ) ){
return $this->database[$name];
}
}
public function getLinks(){
$links = "Link A ";
$links.= "Link B ";
$links.= "Link C ";
return $links;
}
}
====================================================
View.php
class View {
public function display($output){
// ob_start();
echo $output;
}
}
PHP 相关文章推荐
PHP 采集心得技巧
May 15 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
Apr 26 PHP
PHP在线生成二维码代码(google api)
Jun 03 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
php常用的url处理函数总结
Nov 19 PHP
PHP5.2下preg_replace函数的问题
May 08 PHP
详解WordPress开发中的get_post与get_posts函数使用
Jan 04 PHP
如何使用微信公众平台开发模式实现多客服
Jan 06 PHP
PHP实现15位身份证号转18位的方法分析
Oct 16 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 #PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 #PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 #PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 #PHP
php编程每天必学之表单验证
Mar 01 #PHP
实例讲解PHP设计模式编程中的简单工厂模式
Feb 29 #PHP
PHP Try-catch 语句使用技巧
Feb 28 #PHP
You might like
YB217、YB235、YB400浅听
2021/03/02 无线电
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
js实现延迟加载的方法
2015/06/24 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
详解vuex的简单使用
2018/03/12 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
js仿360开机效果
2019/12/26 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
python创建文本文件的简单方法
2020/08/30 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
法律工作求职自荐信
2013/10/31 职场文书
学生就业推荐信
2013/11/13 职场文书
行政助理工作职责范本
2014/03/04 职场文书
爱我中华教学反思
2014/04/28 职场文书
责任担保书范文
2014/05/21 职场文书
建筑工地文明标语
2014/10/09 职场文书
高一作文之暖冬
2019/11/09 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
用python修改excel表某一列内容的操作方法
2021/06/11 Python