博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP笔记09:PHP之 MVC理解
阅读量:4313 次
发布时间:2019-06-06

本文共 5725 字,大约阅读时间需要 19 分钟。

1. 首先通俗地说说我对MVC的理解:

Model是负责干活的,它干的活主要是从数据库中获取需要的数据以及对获取的数据按照业务逻辑进行加工处理,至于为什么要干某件活,何时干某件活它一概不管,而这正是Controller的职责,Controller像个餐馆招待,接到食客的需求,马上传达给厨房,Model就是大厨。View负责最终把菜端上桌,摆在合适的位置上。比如说客人来了要了个糖醋鲤鱼,接待客人的是Controller,它会通知Model做一道糖醋鲤鱼,做好之后它又会招呼View把菜端上桌,View知道这是主菜,它会把它摆在桌子中央。MVC的最大优势就在于把数据处理流程控制UI显示较好地分离开来,便于程序的开发和维护。

 

2.下面看具体实现。

这个小程序一共包含6个文件,其中index.php是程序入口、post.htm是留言表单

在lib文件夹里Model、View 、Controller三个文件分别实现MVC,DataAccess是一个简单的数据库访问类

(1)DataAccess

1 
link_id=mysql_pconnect($host,$user,$pass); //连接数据库服务器22 mysql_select_db($db,$this->link_id); //选择所需数据库23 24 mysql_query("set names utf8;");25 }26 //! 执行SQL语句27 /**28 * 执行SQL语句,获取一个查询源并存储在数据成员$query中29 * @param $sql 被执行的SQL语句字符串30 * @return void31 */32 function query($sql) {33 $this->query_id=mysql_unbuffered_query($sql,$this->link_id); // Perform query here34 if ($this->query_id) return true;35 else return false;36 }37 //! 获取结果集38 /**39 * 以数组形式返回查询结果的所有记录40 * @return mixed41 */42 function fetchRows($sql) {43 $this->query($sql);44 $arr=array();45 $i=0;46 while( $row=mysql_fetch_array($this->query_id,MYSQL_ASSOC) )47 //MYSQL_ASSOC参数决定了数组键名用字段名表示48 { $arr[$i]=$row;49 $i++;50 }51 return $arr;52 53 }54 }55 ?>

(2)下面我们要介绍Model类,这个类很简单,里面的函数一看就知道,是针对各种数据的操作,它是通过DataAccess访问数据库

Model

1 
dao中17 * Model通过调用$this->dao的fetch方法执行所需的SQL语句18 */19 function __construct(&$dao) {20 $this->dao=$dao; 21 }22 function listNote() { //获取全部留言23 $notes=$this->dao->fetchRows("SELECT * FROM note ORDER BY timedate DESC");24 25 return $notes;26 27 }28 29 function postNote() { //插入一条新留言30 31 $name=$_POST['username'];32 $email=$_POST['email'];33 $content=$_POST['content'];34 $timedate=time()+8*3600;35 $sql="INSERT INTO note (name, email, content, timedate) VALUES 36 ('".$name."', '".$email."', '".$content."', '".$timedate."' )";37 //echo $sql; //对于较复杂的合成SQL语句,
38 //调试时用echo输出一下看看是否正确是一种常用的调试技巧39 if ($this->dao->query($sql)) return true;40 else return false;41 }42 43 function deleteNote() { //删除一条留言,$id是该条留言的id44 $sql="DELETE FROM note WHERE id=".$_GET['id'];45 if ($this->dao->query($sql)) return true;46 else return false;47 }48 49 50 }51 ?>

 

(3)看完这两个类之后你可能会发现这与以前我们写程序差不多,的确现在还闻不到MVC的味道,如果你不懂MVC,在这两个类的基础上你完全可以开始写你以前的程序了。例如要显示全部留言,只需要写入下代码:

1 
listNote();8 ……9 ?>

  很亲切吧,呵呵。

    有了这个"感情基础"你就不会对MVC望而生畏了,下面我们就要上今天的主菜了,那就是"Controller"闪亮登场!
    先大体浏览一下主要结构,它包括一个Controller类以及派生出的三个子类listController对应显示留言功能postController对应发表留言功能以及deleteController对应删除留言功能)。

Controller

1 
model;13 */14 function __construct (& $dao) {15 $this->model=& new Model($dao);16 }17 18 function getView() { //获取View函数19 //返回视图对象view20 //对应特定功能的Controller子类生成对应的View子类的对象21 //通过该函数返回给外部调用者22 return $this->view;23 }24 25 }26 //用于控制显示留言列表的子类27 class listController extends Controller{ //extends表示继承 28 function __construct (& $dao) {29 parent::__construct($dao); //继承其父类的构造函数30 //该行的含义可以简单理解为:31 //将其父类的构造函数代码复制过来32 $notes=$this->model->listNote();33 $this->view=& new listView($notes);34 //创建相应的View子类的对象来完成显示35 36 37 38 }39 }40 //用于控制添加留言的子类41 class postController extends Controller{42 function __construct (& $dao) {43 parent::__construct($dao);44 if ($this->model->postNote()) $success=1;45 else $success=0;46 $this->view=& new postView($success);47 }48 }49 //用于控制删除留言的子类50 class deleteController extends Controller{51 function __construct (& $dao) {52 parent::__construct($dao);53 if ($this->model->deleteNote()) $success=1;54 else $success=0;55 $this->view=& new deleteView($success);56 }57 }58 59 ?>

 

(4)大体浏览之后,你一定打算开始仔细研究它了吧,别急,为了心中有数,我们先从宏观着眼,先看看总入口index.php是如何调用Controller的

1  2  3 
4 PHP MVC留言板 5 6 7 添加新留言
8

9

getView(); //获取视图对象38 $view->display(); //输出HTML39 ?>40 41

看过index.php之后你就更清楚了吧,原来功能是通过$_GET[“action”]指定的,由一个switch结构分发,不同的功能对应不同的Controller子类。现在可以滚上去(滚动页面上去的简称,绝非不洁用语^_^)仔细看看这个Controller代码了。注释应该很细了,不懂的地方就去看看PHP5的OOP语法和概念吧,单纯看这些概念总是越看催眠效果越好,现在带着实际问题去看,应该有所不同吧。不过我还是建议你在完成这个MVC的Hello World知道MVC是怎么回事之后下功夫打好OOP的基础,毕竟那是根本啊。

 

(5)怎么样,Controller真是个光说不练的家伙吧,看不到三行它就把你引向View了,那就看看View吧

View里有对应的子类,负责相应功能的显示。理解了Controller,View的代码就不难看了,难看的话也是因为混杂着HTML的原因,它所做的就是把Controller(Controller是个二道贩子,它的数据来自Model)给它的数据,然后塞到HTML中

View

1 
output);13 14 }15 }16 class listView extends View //显示所有留言的子类17 {18 function __construct($notes)19 {20 foreach ($notes as $value)21 {22 $this->output.="

访客姓名:".$value['name']."

".23 "

访客邮箱:".$value['email']."

".24 "

访客留言:".$value['content']."

".25 "

来访时间:".date("y-m-d H:i",$value['timedate'])."

".26 "

删除留言".27 "


"; 28 }29 30 31 }32 }33 class postView extends View //发表留言的子类34 {35 function __construct($success)36 {37 if ($success)38 $this->output="留言成功!
查看";39 else40 $this->output="留言保存失败!";41 }42 }43 class deleteView extends View //删除留言的子类44 {45 function __construct($success)46 {47 if ($success)48 $this->output="留言删除成功!
查看";49 50 }51 }52 ?>

之所以UI方面写得如此简陋,是因为这些工作可以交给Smarty这样的模板去做,而我们这里就像集中精力研究MVC,不想把Smarty扯进来,所以就这样凑合了,以后我们可以再把Smarty结合进来。

看了这个东西之后不知你是否对MVC的概念和实现更明白了一点。

转载于:https://www.cnblogs.com/hebao0514/p/5670607.html

你可能感兴趣的文章
费马小定理与GCD&LCM
查看>>
P1077 摆花
查看>>
zynq修改ramdisk文件系统
查看>>
C#测量程序运行时间及cpu使用时间
查看>>
并发编程
查看>>
我自己曾经经历的CMMI3认证通过关于软件测试的访谈【转载】
查看>>
C# 操作Excel ——Excel获取数据、时间、图片
查看>>
【Express系列】第3篇——接入mysql
查看>>
js 高亮显示关键字
查看>>
CPU工作原理简图
查看>>
进程互斥于同步
查看>>
小米公布2017二季度手机出货量:环比增长70%
查看>>
IntelliJ Idea 集成svn 和使用[转自网络]
查看>>
VS2013 密钥 – 所有版本
查看>>
缓冲一日
查看>>
apache常用配置文件讲解
查看>>
html设置透明度
查看>>
读写锁详解
查看>>
<taglib>报错
查看>>
sublime 3 注册码 - 亲测可用
查看>>