| 階段 | 架構 | 特點 | 優點 | 缺點 |
|---|---|---|---|---|
| Model 1 | JSP/ASP/PHP 混寫 HTML + SQL | 單文件包含展示與邏輯 | 簡單、開發快、適合極小項目 | 耦合極高、難維護、不利團隊協作 |
| Model 2 (MV) | View (PHP/HTML) + Model (Class) | 業務邏輯封裝到類,視圖只負責顯示 | 分層清晰、可復用、利於分工 | 控制邏輯分散在各 View,請求多時混亂 |
| MVC | Model + View + Controller | 引入 Controller 統一分發請求 | 職責單一、易擴展、利於大型團隊 | 初期搭建成本高、學習曲線陡 |
Controller 基類,統一處理請求參數、異常、視圖渲染。$_GET/$_POST 邏輯移入 Controller Action。URL → Controller@Action(如 /user/profile → UserController@profile)。index.php 作為唯一入口,所有請求經由它分發。// public/index.php (唯一入口)
require __DIR__.'/../vendor/autoload.php';
$app = new App();
$app->run();
// core/App.php
class App {
public function run() {
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$route = Router::match($uri); // ['controller'=>'User','action'=>'show','params'=>['id'=>1]]
$controller = new $route['controller']();
$controller->{$route['action']}(...$route['params']);
}
}
// core/Controller.php
abstract class Controller {
protected function view(string $template, array $data = []) {
extract($data);
include VIEW_PATH . "/{$template}.php";
}
protected function json(mixed $data) {
header('Content-Type: application/json');
echo json_encode($data);
}
}
// app/controllers/UserController.php
class UserController extends Controller {
public function show(int $id) {
$user = UserModel::find($id);
if (!$user) { $this->json(['error'=>'Not found']); return; }
$this->view('user/profile', ['user' => $user]);
}
}
// app/models/UserModel.php
class UserModel {
public static function find(int $id): ?array {
// PDO 查詢...
return ['id'=>$id, 'name'=>'Alice'];
}
}
// app/views/user/profile.php
<h1>用戶資料</h1>
<p>姓名:<?= htmlspecialchars($user['name']) ?></p>
MVC 不是銀彈,但它為 PHP 專案提供了清晰的分層邊界。小項目可用輕量骨架;中大型項目建議直接採用 Laravel、Symfony、ThinkPHP 等成熟框架,專注業務創新而非重複造輪子。