首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

從零手寫 PHP MVC 留言本:深度解析架構落地全過程

     編輯:PHP 綜合知識

MVC 模式是現代 Web 開發的基石,但很多教程只講理論不落地。本文通過一個極簡留言本(僅 6 個文件),完整演示從入口分發到模型/視圖/控制器分層協作的全流程,讓你在代碼層面真正理解 MVC 運作機制。

專案結構一覽

├── index.php          # 單一入口
├── post.htm           # 留言表單
└── lib/
    ├── DataAccess.php # 資料庫訪問層
    ├── Model.php      # 業務邏輯層
    ├── View.php       # 視圖渲染層
    └── Controller.php # 請求分發層

核心層代碼深度解析

1. DataAccess:輕量資料庫封裝

僅封裝連線、查詢、獲取行三個核心方法,採用 mysql_pconnect 長連線:

class DataAccess {
    var $db, $query;
    function __construct($host,$user,$pass,$db) {
        $this->db = mysql_pconnect($host,$user,$pass);
        mysql_select_db($db,$this->db);
    }
    function fetch($sql) { $this->query = mysql_unbuffered_query($sql,$this->db); }
    function getRow() { return mysql_fetch_array($this->query, MYSQL_ASSOC) ?: false; }
}

2. Model:業務邏輯集中地

所有資料操作(增刪改查)集中於此,控制器零 SQL:

class Model {
    var $dao;
    function __construct(&$dao) { $this->dao = $dao; }
    function listNote() { $this->dao->fetch("SELECT * FROM note"); }
    function postNote($name,$content) { /* INSERT SQL */ }
    function deleteNote($id) { /* DELETE SQL */ }
    function getNote() { return $this->dao->getRow(); }
}

3. Controller:請求分發中樞

採用「基類 + 子類」模式,根據 $_GET['action'] 實例化對應子控制器:

class Controller {
    var $model, $view;
    function __construct(&$dao) { $this->model = new Model($dao); }
    function getView() { return $this->view; }
}
class listController extends Controller {
    function __construct(&$dao) {
        parent::__construct($dao);
        $this->view = new listView($this->model);
    }
}
// postController、deleteController 結構同理

4. 入口文件 index.php:統一分發

$dao = new DataAccess('localhost','root','','test');
$action = $_GET["action"] ?? 'list';
switch ($action) {
    case 'post':   $controller = new postController($dao,$_POST); break;
    case 'delete': $controller = new deleteController($dao,$_GET["id"]); break;
    default:       $controller = new listController($dao);
}
$controller->getView()->display();

5. View:視圖渲染與模板邏輯分離

各子類負責具體 HTML 組裝,從 Model 獲取數據:

class listView extends View {
    function __construct(&$model) {
        parent::__construct($model);
        $this->model->listNote();
        while ($note = $this->model->getNote()) {
            $this->output .= "姓名:$note[name] 留言:$note[content] 刪除 ";
        }
    }
}

MVC 協作流程圖解

  1. 用戶請求 index.php?action=list
  2. 入口實例化 DataAccess → listController → listView
  3. listView 調用 Model::listNote() 觸發 SQL 查詢
  4. Model 通過 DataAccess 獲取資料集
  5. View 遍歷結果組裝 HTML → display() 輸出

架構優勢實戰體會

  • 即插即用擴展:新增「按用戶查詢」只需在 Model 加方法、Controller/View 各加子類,零修改既有代碼
  • 邏輯極度清晰:SQL 只在 Model、分發只在 Controller、HTML 只在 View
  • 團隊協作友好:後端寫 Model/Controller,前端寫 View,互不干擾

避坑指南

  1. 嚴禁在 View 寫 SQL 或業務邏輯
  2. Controller 僅負責協調,不直接操作資料庫
  3. Model 只返回純數據(陣列/物件),不輸出 HTML
  4. 入口文件只做分發,不包含任何業務代碼

這個「簡陋」的留言本,卻完整包含了 MVC 的靈魂。建議動手跑通、改造、擴展它——這比閱讀十本理論書更有效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved