
批改狀態(tài):合格
老師批語:有二點(diǎn)澄清一下: 1. MVC是編程思想,并非設(shè)計(jì)模式,類似的還是MVVM 2. MVC并非只在TP,Laravel中應(yīng)用, 只要涉及前后端合作開發(fā), 都可以使用它
MVC作為一種常用的設(shè)計(jì)模式,得到了如TP5、Laravel等框架的廣泛采用。
下面以電影表為例進(jìn)行實(shí)踐
連接數(shù)據(jù)庫
<?php
/**
* 數(shù)據(jù)庫的基本操作
*/
//7個方法實(shí)現(xiàn)兩類功能:1.創(chuàng)建當(dāng)前類的單一實(shí)例 2.創(chuàng)建數(shù)據(jù)庫的基本操作
//use PDO;
class Db
{
//單例模式--$instance本類的實(shí)例
private static $instance = null;
//連接數(shù)據(jù)庫
private $pdo = null;
//數(shù)據(jù)庫的默認(rèn)連接參數(shù)
private $dbConfig=[
'db'=>'mysql',
'host'=>'localhost',
'port'=>'3306',
'dbname'=>'anguoguo',
'user'=>'root',
'password'=>'root',
// 'charset'=>'utf8'//默認(rèn)字符集有無必要設(shè)置
];
public $insertId = null;//新增主鍵id
public $num = 0;//新增更改記錄
private function __construct($params)
{
//初始化連接參數(shù)--因用戶可能有自定義的一些參數(shù)
$this->dbConfig = array_merge($this->dbConfig,$params);//數(shù)組合并
//連接數(shù)據(jù)庫
$this->connect();
}
//禁止外部克隆
private function __clone()
{
// TODO: Implement __clone() method.
}
public static function getInstance($params=[]){
if(!self::$instance instanceof self){
self::$instance = new self($params);
}
return self::$instance;//獲取類的單一實(shí)例
}
private function connect(){//連接數(shù)據(jù)庫還是在本類中使用,故使用private
try {
//數(shù)據(jù)源
$dsn = "{$this->dbConfig['db']}:host={$this->dbConfig['host']};
port={$this->dbConfig['port']};dbname={$this->dbConfig['dbname']}";
//創(chuàng)建PDO對象
$this->pdo = new PDO($dsn,$this->dbConfig['user'],$this->dbConfig['password']);
// //設(shè)置客戶端默認(rèn)字符集 pdo中讀和寫分開,寫是exec,查詢是query
// $this->pdo->query("SET NAMES {$this->dbConfig['charset']}");
}catch (PDOException $error){
die('數(shù)據(jù)庫連接失敗' . $error->getMessage());
}
}
//數(shù)據(jù)表的寫操作:增、刪、改 && 返回受影響的記錄
public function exec($sql){
$num = $this->pdo->exec($sql);
if($num>0){
if(!empty($this->pdo->lastInsertId())){//null !==
$this->insertId = $this->pdo->lastInsertId();
}
$this->num = $num;//返回受影響的記錄
}else{
$error = $this->pdo->errorInfo();//獲取最后操作的的錯誤信息數(shù)組
print '操作失敗'.$error[0].':'.$error[1].':'.$error[2];
}
}
//獲取單條查詢結(jié)果
public function fetch($sql){
return $this->pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
}
//獲取多條查詢結(jié)果
public function fetchAll($sql){
return $this->pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
}
Model.php公共模型類—完成數(shù)據(jù)庫連接及一些公共方法
<?php
class Model
{
protected $db = null;//只給子類調(diào)用,數(shù)據(jù)庫連接對象
public $data = null;
public function __construct()
{
$this->init();//初始化的方法,完成數(shù)據(jù)庫鏈接
}
private function init(){
$dbConfig = [
'dbname'=>'anguoguo',
'user'=>'root',
'password'=>'root',
];//Db.php中已經(jīng)定義了---這里是用戶的自定義參數(shù),即params
//自定義鏈接配置覆蓋默認(rèn)參數(shù)
$this->db = Db::getInstance($dbConfig);
}
//獲取單條數(shù)據(jù)
public function get($id){
$sql = "SELECT * FROM movies WHERE id={$id}";
return $this->data = $this->db->fetch($sql);
}
//獲取全部數(shù)據(jù)
public function getAll(){
$sql = "SELECT * FROM movies";
return $this->data = $this->db->fetchAll($sql);
}
}
MoviesModel.php放用戶自定義的方法
<?php
//用戶自定義模型
class MoviesModel extends Model
{
//可以擴(kuò)展功能
}
MoviesController.php用戶自定義模型對應(yīng)的控制器
<?php
/**
* 電影模塊控制器類通常包括:查詢,更新,添加,刪除
* 模型根據(jù)數(shù)據(jù)表建立,控制器根據(jù)模塊創(chuàng)建
* 所以一個控制器要完成一個模塊的功能,這里完成的查詢功能
*/
//一張表對應(yīng)一個模型 控制器中的方法大多是模型操作的具體實(shí)現(xiàn) 大多數(shù)控制器類的方法都有對應(yīng)視圖文件
class MoviesController//用戶自定義控制器,加Controller方便自動加載和明確操作
{
public function listAll(){
//實(shí)例化模型,獲取數(shù)據(jù)
$mov = new MoviesModel();
$data = $mov->getAll();//來自父類Model中的方法
// echo '<pre>';//格式化方便查看
// print_r($data);
// 有了視圖文件后取代上面的打印
require "H:/Programfile/phpstudy_pro/WWW/html/lecture/easymvc/mvc/view/movies_list.php";
//用相對路徑會出錯
}
//獲取單條數(shù)據(jù)
public function info($id=1){
$id = isset($_GET['mov_id'])? $_GET['mov_id']:$id;
$mov = new MoviesModel();
$data = $mov->get($id);//來自父類Model中的方法
echo '<pre>';
print_r($data);
}
}
index.php項(xiàng)目的入口文件
<?php
//前端控制器--請求分發(fā)器,入口文件功能
//加載模型類
require 'model/Db.php';
require 'model/Model.php';
require 'model/MoviesModel.php';
//加載控制器 路由 控制器及控制器中方法
$controller = isset($_GET['c']) ? $_GET['c'] : 'Movies';//判斷當(dāng)前url中是否有c--controller
$controller .= 'Controller';//給控制器添加后綴名
//require 'controller/MoviesController.php';//加載控制器類,方便調(diào)用方法
require 'controller/' . $controller . '.php';//加載控制器類,方便調(diào)用方法
$action = isset($_GET['a']) ? $_GET['c'] : 'listAll';//獲取方法
$mov = new $controller();//實(shí)例化自定義控制器類
$mov->$action();//根據(jù)電影id,默認(rèn)為1
用fetch的數(shù)據(jù)渲染html頁面
<!--視圖一般用模板引擎來寫-->
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>MVC示例</title>
</head>
<body>
<h2 align="center">電影目錄</h2>
<table border="1" cellpadding="5" cellspacing="0" align="center" width="70%">
<tr bgcolor="#6495ed">
<th>ID</th>
<th>片名</th>
<th>圖片</th>
<th>詳情</th>
<th>分類</th>
</tr>
<?php foreach ($data as $mov): ?>
<!-- MoviesController賦的變量為$data-->
<tr align="center">
<td><?php echo $mov['mov_id']; ?></td>
<td><?php echo $mov['name']; ?></td>
<td><?php echo $mov['image']; ?></td>
<td><?php echo $mov['detail']; ?></td>
<td><?php echo $mov['cate_id']; ?></td>
</tr>
<?php endforeach;?>
</table>
<p align="center">共計(jì):<?php echo count($data); ?>條記錄</p>
</body>
</html>
渲染后效果如下:
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號