php 实现mvc
在 PHP 中实现 MVC(Model-View-Controller)架构可以通过以下方式完成。MVC 将应用程序分为三个核心组件:模型(数据处理)、视图(用户界面)和控制器(业务逻辑)。以下是具体实现步骤:
项目目录结构
典型的 MVC 项目目录结构如下:
project/
├── app/
│ ├── controllers/
│ ├── models/
│ ├── views/
│ └── core/ (可选,存放核心类)
├── public/
│ └── index.php (入口文件)
└── vendor/ (Composer 依赖)
入口文件 (public/index.php)
入口文件负责初始化应用程序并路由请求:
<?php
require_once '../app/bootstrap.php'; // 初始化配置
$app = new Core\App();
$app->run();
核心类 (app/core/App.php)
核心类处理路由和调度:
namespace Core;
class App {
protected $controller = 'Home';
protected $method = 'index';
protected $params = [];
public function __construct() {
$url = $this->parseUrl();
// 控制器逻辑
if (file_exists('../app/controllers/' . ucfirst($url[0]) . 'Controller.php')) {
$this->controller = ucfirst($url[0]);
unset($url[0]);
}
require_once '../app/controllers/' . $this->controller . 'Controller.php';
$this->controller = new $this->controller;
// 方法逻辑
if (isset($url[1])) {
if (method_exists($this->controller, $url[1])) {
$this->method = $url[1];
unset($url[1]);
}
}
// 参数处理
$this->params = $url ? array_values($url) : [];
call_user_func_array([$this->controller, $this->method], $this->params);
}
protected function parseUrl() {
if (isset($_GET['url'])) {
return explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL));
}
return ['home'];
}
}
控制器示例 (app/controllers/HomeController.php)
控制器处理业务逻辑并调用模型和视图:
namespace App\Controllers;
use Core\Controller;
use App\Models\Post;
class HomeController extends Controller {
public function index() {
$posts = Post::getAll();
$this->view('home/index', ['posts' => $posts]);
}
}
模型示例 (app/models/Post.php)
模型负责数据操作:
namespace App\Models;
use Core\Model;
use PDO;
class Post extends Model {
public static function getAll() {
$db = static::getDB();
$stmt = $db->query('SELECT * FROM posts');
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
视图示例 (app/views/home/index.php)
视图负责展示数据:
<!DOCTYPE html>
<html>
<head>
<title>Posts</title>
</head>
<body>
<?php foreach ($posts as $post): ?>
<h1><?= htmlspecialchars($post['title']) ?></h1>
<?php endforeach; ?>
</body>
</html>
数据库连接 (app/core/Model.php)
基础模型类处理数据库连接:
namespace Core;
use PDO;
class Model {
protected static function getDB() {
static $db = null;
if ($db === null) {
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8';
$db = new PDO($dsn, DB_USER, DB_PASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return $db;
}
}
自动加载与配置
使用 Composer 的 PSR-4 自动加载(composer.json):
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
配置文件 (app/config.php) 定义常量如数据库连接信息。
路由改进(可选)
使用第三方库如 nikic/FastRoute 实现更灵活的路由:

$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/posts', 'PostController@index');
});
通过以上步骤,可以构建一个基础的 PHP MVC 框架。实际项目中可能需要添加中间件、依赖注入等高级功能。






