一、MVC设计模式概述

1.什么是MVC设计模式
2. MVC设计模式的优势和缺点

二、 MVC典型实现

1.模型
   数据库操作类
   模型类
2.控制器
   模块
   控制器类
3.视图
4.前端控制器(入口文件)

一、MVC设计模式概述

1.什么是MVC设计模式

MVC是Xerox PRAC(施乐帕克研究中心)在80年代为编程语言 Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。MVC设计模式强制性的使应用程序中的输入、处理和输出分开,将软件系统分成了三个核心部件:模型(Model)、视图(View)、控制器(Controller) 它们各自处理自己的任务。MVC是一种开发设计规范,使代码组织更加合理、流程更加清晰ThinkPHP框架是基于MVC模式来做为基本运行流程,因此,MVC部分一定要理解掌握,以便于后续的框架学习。

##### 2. MVC设计模式的优势和缺点 1)优点:   各司其职、互不干涉;   有利于开发中的分工;   有利于组建的重用;

2)缺点:
  系统结构和实现复杂;
  视图与控制器过于紧密;
  不适用于小型甚至中型应用程序;

二、 MVC典型实现

  1. 创建模型,生成并返回数据
  2. 创建控制器,将模型和视图整合
  3. 创建视图,展示模型生成并返回的数据
  4. 创建入口文件,调用控制器完成操作

1.创建模型,生成并返回数据

在面对复杂问题时,面向对象编程可以更好的描述现实中的业务逻辑,所以MVC的程序也是通过面向对象的方式实现的m模型是处理数据的,而数据是存储在数据库里的。在项目中,所有对数据库的直接操作,都应该封装到一个数据库操作类中。
运用学过的面向对象、单例模式、PDO等相关知识,就可以封装一个PDO的数据库操作类。

1)封装一个PDO数据库操作类(Db.php)

<?php
/*** PDO-MySQL数据库操作类*/
class MySQLPDO{//数据库默认连接信息private $dbConfig = array('db'   => 'mysql', //数据库类型'host' => 'localhost', //服务器地址'port' => '3306', //端口'user' => 'root', //用户名'pass' => 'weicunbin123', //密码'charset' => 'utf8', //字符集'dbname' => 'testguest', //默认数据库);//单例模式 本类对象引用private static $instance;//PDO实例private $db;/*** 私有构造方法* @param $params array 数据库连接信息*/private function __construct($params){//初始化属性$this->dbConfig = array_merge($this->dbConfig,$params);//连接服务器$this->connect();}/*** 获得单例对象* @param $params array 数据库连接信息* @return object 单例的对象*/public static function getInstance($params = array()){if(!self::$instance instanceof self){self::$instance = new self($params);}return self::$instance; //返回对象}/*** 私有克隆*/private function __clone() {}/*** 连接目标服务器*/private function connect(){try{//连接信息$dsn = "{$this->dbConfig['db']}:host={$this->dbConfig['host']};port={$this->dbConfig['host']};dbname={$this->dbConfig['dbname']};charset={$this->dbConfig['charset']}";//实例化PDO$this->db = new PDO($dsn,$this->dbConfig['user'],$this->dbConfig['pass']);//设定字符集$this->db->query("set names {$this->dbConfig['charset']}");echo 1;}catch (PDOException $e){//错误提示die("数据库操作失败:{$e->getMessage()}");}}/*** 执行SQL* @param $sql string 执行的SQL语句* @return object PDOStatement*/public function query($sql){$rst = $this->db->query($sql);if($rst===false){$error = $this->db->errorInfo();die("数据库操作失败:ERROR {$error[1]}({$error[0]}): {$error[2]}");}return $rst;}/*** 取得一行结果* @param $sql string 执行的SQL语句* @return array 关联数组结果 */public function fetchRow($sql){return $this->query($sql)->fetch(PDO::FETCH_ASSOC);}/*** 取得所有结果* @param $sql string 执行的SQL语句* @return array 关联数组结果 */public function fetchAll($sql){return $this->query($sql)->fetchAll(PDO::FETCH_ASSOC);}public function demo(){echo '测试内容';}
}// // 调用方式
// // 连接数据库
// $pdo = MySQLPDO::getInstance();
// // 调用方法
// $pdo -> demo()

2)模型类
在实际项目中,通常是在一个数据库中建立多个表来管理数据,如下图。MVC中的模型,其实就是为项目中的每个表建立一个模型。如果用面向对象的思想,那么每个模型都是一个模型类,对表的所有操作,都要放到模型类中完成。


前面学习了数据库操作类,实例化数据库操作类是所有模型类都要经历的一步,因此需要一个基础模型类来完成这个任务。

例:

  • 创建基础模型类:
  • 创建Student模型类
<?php
/*** 基础模型类*/
class model {protected $db; //保存数据库对象public function __construct(){$this->initDB(); // 初始化数据库}private function initDB(){//配置数据库连接信息$dbConfig = array('dbname'=>'mvc_study');//实例化数据库操作类$this->db = MySQLPDO::getInstance($dbConfig);}
}
<?php
/*** student表的操作类,继承基础模型类*/
class studentModel extends model{/* 查询所有学生 */public function getAll(){$data = $this->db->fetchAll('select * from `student`');return $data;}/* 查询指定id的学生 */public function getByID($id){$data = $this->db->fetchRow("select * from `student` where id={$id}");return $data;}
}
3、创建控制器,将模型和视图整合

控制器是MVC应用程序中的指挥官,它接收用户的请求,并决定需要调用哪些模型进行处理,再用相应的视图显示从模型返回的数据,最后通过浏览器呈现给用户。
1)模块
如果用面向对象的方式实现控制器,就需要先理解模块(Module)的概念。一个成熟的项目是由多个模块组成的,每个模块又是一系列相关功能的集合。接下来通过一个图例来演示项目中的模块,如图所示:

2)控制器类
控制器是根据模块创建的,即每个模块对应一个控制器类 创建StudentController.class.php控制器类,实现的功能:

  • 查看所有学生信息
  • 查看指定学生信息
<?php
<?php
/** @Descripttion: * @version: * @Author: wei* @Date: 2020-04-09 10:23:14* @LastEditors: wei* @LastEditTime: 2020-04-17 16:23:37*/
/*** 学生模块控制器类*/
class studentController{/*** 学生列表*/public function listAction(){//实例化模型,取出数据$stu = new studentModel();$data = $stu->getAll();//载入视图文件require 'student_list.html';}/*** 查看指定学生信息*/public function infoAction(){//接收请求参数$id = $_GET['id'];//实例化模型,取出数据$stu = new studentModel();$data = $stu->getById($id);//载入视图文件require 'student_info.html';}
}

3)视图文件
根据控制器类要实现的功能方法,创建视图文件,这里没有创建,直接打印出数据代替了

  • 查看所有学生信息视图文件:student_list.html
  • 查看指定学生信息视图文件:student_info.html
  • student_list.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
table{border-collapse:collapse;text-align:center;}
a{text-decoration:none;}
</style>
</head>
<body>
<h1>学生列表</h1>
<table width="300" border="1"><tr><th>ID</th><th>姓名</td><th>操作</th></tr><?php foreach($data as $v): ?><tr><td><?php echo $v['id']; ?></td><td><?php echo $v['name']; ?></td><td><a href="index.php?c=student&a=info&id=<?php echo $v['id']; ?>">查看</a></td></tr><?php endForeach; ?>
</table>
</body>
</html>

student_info.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
table{border-collapse:collapse;text-align:center;}
a{text-decoration:none;}
</style>
</head>
<body>
<h1>查看学生信息</h1>
<table width="300" border="1"><tr><th>ID</th><td><?php echo $data['id']; ?></td></tr><tr><th>姓名</th><td><?php echo $data['name']; ?></td></tr><tr><th>性别</th><td><?php echo $data['gender']; ?></td></tr><tr><th>年龄</th><td><?php echo $data['age']; ?></td></tr>
</table>
<a href="index.php">返回</a>
</body>
</html>
5、前端控制器(入口文件index.php)

前端控制器也称为请求分发器(dispather),通过URL参数判断用户请求了哪个功能,然后完成相关控制器的加载、实例化、方法调用等操作。
使用MVC开发的是一种单一入口的应用程序,传统的Web程序是多入口的,即通过访问不同的文件来完成用户请求。
例如教务管理系统,管理学生时访问student.php,管理教师时访问teacher.php。
单入口程序只有一个index.php提供用户访问。

<?php
/*** 前端控制器*/
header('Content-Type:text/html; charset=utf8');
//载入数据库操作类
require('MySQLPDO.class.php');
//载入模型文件
require 'model.class.php';
require 'studentModel.class.php';
//得到控制器名
$c = isset($_GET['c']) ? $_GET['c'] : 'student';
//载入控制器文件
require './'.$c.'Controller.class.php';
//实例化控制器(可变变量)
$controller_name = $c.'Controller';
$controller = new $controller_name;
//得到方法名
$action = isset($_GET['a']) ? $_GET['a'] : 'list';
//调用方法(可变方法)
$action_name = $action.'Action';
$controller->$action_name();

效果展示

php之mvc设计模式的原理和实现相关推荐

  1. ASP.NET下MVC设计模式的实现

    1 MVC设计模式简介 MVC由Trygve Reenskaug提出,首先被应用在SmallTalk-80环境中,是许多交互和界面系统的构成基础.MVC结构是为那些需要为同样的数据提供多个视图的应用程 ...

  2. MVC设计模式原理简述

    开发MVC项目之前首先明确一点,MVC设计模式可以带来更好的软件结构和代码重用. MVC如何工作 MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC 应用程序被分成三个核心部 ...

  3. IT兄弟连 JavaWeb教程 MVC设计模式

    MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它强制性地把应用程序的数据展示.数据处理和流程控制分开.MVC把应用程序分成3个核心模块:模型.视 ...

  4. iOS中MVC设计模式

    在组织大型项目的代码文件时,我们常用MVC的思想.MVC的概念讲起来非常简单,就和对象(object)一样.但是理解和应用起来却非常困难.今天我们就简单总结一下MVC设计理念. MVC(Model V ...

  5. 谈谈JAVA工程狮面试中经常遇到的面试题目------什么是MVC设计模式

    作为一名java工程狮,大家肯定经历过很多面试,但每次几乎都会被问到什么是MVC设计模式,你是怎么理解MVC的类似这样的一系列关于MVC的问题. [出现频率] [关键考点] MVC的含义 MVC的结构 ...

  6. [ZZ]MVC设计模式

    1 前言 用户界面,特别是图形用户界面,承担着向用户显示问题模型和与用户进行操作和I/O交互的作用.用户希望保持交互操作界面的相对稳定,但更希 望根据需要改变和调整显示的内容和形式.例如,要求支持不同 ...

  7. MVC框架的原理详解

    阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHandler.IHttpHandler.MvcHandler的说明 2.IHttpHandler解析 3.Mvc ...

  8. MVC设计模式及Sprint MVC设计模式

    文章目录 一.MVC设计模式简介 二.Spring MVC处理用户请求的完整流程 2.1. Spring MVC 框架主要由 DispatcherServlet.处理器映射.控制器.视图解析器.视图组 ...

  9. iOS——MVC设计模式

    什么是MVC MVC是Model-View-Controller的简写,它表示的是一种常见的客户端软件开发框架.可见他是由三个部分组成的. 下面解释一下这三个部分: Model:即为模型,用来存储业务 ...

  10. 一篇带你走进程序设计的准则——DAO和MVC设计模式

    一.DAO设计模式 DAO最适用于单系统应用程序或小范围本地分布式应用程序使用 1. DAO简介 DAO(Data Access Object,数据访问对象)的主要功能就是操作数据库,也就是数据的增删 ...

最新文章

  1. linux mysql内网_在Linux中mysql的一些基本操作
  2. Appium录制脚本520-2
  3. 洛谷U4807抽水机[最小生成树]
  4. 新产品孕育记:PM如何把一款产品从0带到1
  5. adb命令实现一些有趣的功能
  6. centos6.5 tar安装mysql_centos6.6安装mysql5.7.9tar包
  7. PHP如何添加变量 $_SERVER
  8. ctrl+alt+T出来的终端窗口非常小
  9. 钱德沛教授:云计算和网格计算差别何在?
  10. Android之网络调试adb tcpip
  11. 解决:vue文本识别 “ \n ” 的换行问题(完整案例说明)
  12. 树莓派4B使用移远EC20带GPS 4G模块ppp拨号上网
  13. DBeaver下载安装教程
  14. 一位程序员工作10年总结的10条建议
  15. 计算机设置ip后提示未识别网络连接,win10设置正确的静态IP,但电脑显示未识别网络,怎么回事。求大佬们帮助啊...
  16. [iOS URL Schemes相关] URL Schemes 转载
  17. Mybatis---简单缓存了解
  18. 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归
  19. 【持续更新】计算机类PDF整理
  20. hadoop2 hdfs 垃圾箱简介

热门文章

  1. Google之海量数据的交互式分析工具Dremel
  2. Android新组件CardView
  3. Android 游戏开发中横竖屏切换问题
  4. java excel 导入oracle_java代码导入excel数据至oracle(poi方式)
  5. java字符串计数从零还是从一,java – 计数和所有字符相同的最大字符串的起始索引...
  6. 快速排序_two-powinters思想
  7. linux客户端工具有哪些,Linux命令以及客户端工具的使用
  8. Java从入门到精通 第10章 方法
  9. java io 读取配置文件_(转)Java 读写Properties配置文件
  10. Ubuntu16.04下Hadoop+Hive+HBase安装部署实践