MVC基本架构思想
php编程的几种模式
混编模式:php和html混合在一起
逻辑和显示模式:php和html代码分开,先写逻辑php部分,引入html文件
MVC:就是把逻辑部分 分离成controlor (控制器)和model(模型) 、显示(view);
M:Model,模型,项目中的数据处理单元,专门负责和数据库进行交互(增删改查)--------相当于饭店中的洗菜或改刀人员
V:View,视图,项目中应用结果展示的单元,(以前的模板文件 html js css等)----------相当于饭店中的服务员,上菜操作
C:Controlle,控制器,项目中负责某个功能整体流程的调用单元-----------------相当于饭店中的厨师,负责调动
此时,浏览器只需要和C 控制器进行交互,而模型M和视图V都被控制器所调用,并且模型M和V之间不存在任何的交互
MVC架构优点:
代码结构分工明确,谁该干什么就干什么,可读性强
项目开发效率高,更有利于团队合作
后期项目的维护和升级变得非常容易
MVC架构的缺点
降低了代码运行的效率
强调:
MVC项目中架构思想,指的是项目中代码间的组织关系,不决定语法形式,面向过程和面向对象都可以使用MVC的架构思想
但是,MVC和面向对象语法才是"黄金搭档",所以,我们项目中的功能基本上都还要封装到类中!
简单的MVC代码展示
Model 模型层
<?php class MyPDO { private static $instance; //保存对象 private $host; //主机地址 private $dbname; //数据库名字 private $port; //端口 private $user; //用户名 private $pwd; //密码 private $charset; //字符集 private $link; //连接对象 private function __construct($data){ $this->initParam($data); $this->getPDO(); $this->errorMode(); } private function __clone(){ } //获取单例 public static function getInstance($data=array()){ if(!self::$instance instanceof self){ return self::$instance=new self($data); } return self::$instance; } //初始化参数 private function initParam($data){ $this->host=$data['host'] ?? 'localhost'; $this->dbname=$data['dbname'] ?? 'my_db'; $this->port=$data['port'] ?? '3306'; $this->user=$data['user'] ?? 'root'; $this->pwd=$data['host'] ?? 'root'; $this->charset=$data['charset'] ?? 'utf8'; } //显示错误 private function showError($e,$sql=null){ echo "错误信息".$e->getMessage()."<br>"; echo "错误代码".$e->getCode()."<br>"; echo "错误文件".$e->getFile()."<br>"; echo "错误行号".$e->getLine().'<br>'; if($sql!=null){ echo "错误sql语句".$sql; } } //连接数据库 private function getPDO(){ try { $this->link= new PDO("mysql:host={$this->host};port={$this->port};dbname={$this->dbname};charset={$this->charset}","{$this->user}","{$this->pwd}"); } catch (PDOException $e) { $this->showError($e); exit; } } //设置错误模式 private function errorMode(){ $this->link->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); } /** * 增删改功能 * @param string sql语句 * @return int 受影响的行数 */ public function exec($sql){ try { return $row=$this->link->exec($sql); } catch (PDOException $e) { $this->showError($e,$sql); exit; } } /** * 获取二维数组结果集 * @param string sql * @return PDOStatement 结果集 */ public function fetchAll($sql){ try{ $stmt=$this->link->query($sql); return $stmt->fetchAll(); }catch(PDOException $e){ $this->showError($e,$sql); } } /** * 获取一维数组结果集 *@param string sql *@return PDOStatement 结果集 */ public function fetch($sql){ try { $stmt= $this->link->query($sql); return $stmt->fetch(); } catch (PDOException $e) { $this->showError($e,$sql); } } /** * 获取单行单列 * @param string sql * @return mixed 内容 */ public function fetchColumn($sql){ try { $stmt=$this->link->query($sql); return $stmt->fetchColumn(); } catch (PDOException $e) { $this->showError($e,$sql); } } //转账事务操作 public function beginTransction($sql_out,$sql_in){ try { $this->link->beginTransaction(); $out=$this->link->exec($sql_out); $in=$this->link->exec($sql_in); if($out && $in){ $this->link->commit(); echo "转账成功"; }else{ $this->link->rollBack(); } } catch (PDOException $e) { $this->showError($e); } } }
View 视图层
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <form action="" method="get"> 转出卡号:<input type="text" name="out" id=""><br> 转入卡号:<input type="text" name="in" id=""><br> 金额:<input type="text" name="money" id=""><br> <input type="submit" value="转账"> </form> </body> </html>
Controller 控制器层
<?php //控制器调用视图 view.html require 'view.html'; //调用Model 模型类; require 'model.php'; if(!empty($_GET)){ $out=$_GET['out']; $in=$_GET['in']; $money=$_GET['money']; $pdo=MyPDO::getInstance(); $pdo->beginTransction("update my_bank set mony=mony-$money where carNo=$out","update my_bank set mony=mony+$money where carNo=$in"); }