php实现mvc
PHP 实现 MVC 架构
MVC(Model-View-Controller)是一种常见的软件设计模式,用于分离应用程序的逻辑、数据和界面。以下是在 PHP 中实现 MVC 架构的关键步骤:
目录结构
典型的 MVC 目录结构如下:
app/
controllers/
models/
views/
public/
index.php
入口文件 (public/index.php)
入口文件负责初始化应用程序并路由请求:
<?php
require '../app/bootstrap.php';
$router = new Router();
$router->dispatch($_SERVER['REQUEST_URI']);
路由类
路由类解析 URL 并调用相应的控制器和方法:

class Router {
public function dispatch($url) {
// 解析URL获取控制器和方法
$parts = explode('/', trim($url, '/'));
$controller = $parts[0] ?: 'home';
$action = $parts[1] ?? 'index';
$controllerClass = ucfirst($controller).'Controller';
require_once "../app/controllers/$controllerClass.php";
$controllerInstance = new $controllerClass();
$controllerInstance->$action();
}
}
控制器示例 (app/controllers/HomeController.php)
class HomeController {
public function index() {
$model = new HomeModel();
$data = $model->getData();
require '../app/views/home/index.php';
}
}
模型示例 (app/models/HomeModel.php)
class HomeModel {
public function getData() {
// 这里通常是数据库操作
return ['title' => 'Welcome', 'content' => 'Hello MVC'];
}
}
视图示例 (app/views/home/index.php)
<!DOCTYPE html>
<html>
<head>
<title><?= $data['title'] ?></title>
</head>
<body>
<h1><?= $data['content'] ?></h1>
</body>
</html>
自动加载
使用 spl_autoload_register 实现自动加载:
spl_autoload_register(function($class) {
$file = '../app/' . str_replace('\\', '/', $class) . '.php';
if (file_exists($file)) {
require $file;
}
});
高级实现建议
使用 Composer
通过 Composer 管理依赖和自动加载:

{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
数据库抽象
在模型中使用 PDO 进行数据库操作:
class UserModel {
private $db;
public function __construct() {
$this->db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
}
public function getUsers() {
$stmt = $this->db->query('SELECT * FROM users');
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
模板引擎
集成 Twig 等模板引擎替代原生 PHP 视图:
$loader = new \Twig\Loader\FilesystemLoader('../app/views');
$twig = new \Twig\Environment($loader);
echo $twig->render('home/index.twig', $data);
依赖注入
使用依赖注入容器管理对象创建:
$container = new Container();
$container->set('db', function() {
return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
});
$container->set('userModel', function($c) {
return new UserModel($c->get('db'));
});
这种实现方式提供了清晰的代码组织,分离了业务逻辑、数据操作和界面展示,使应用程序更易于维护和扩展。






