php简单实现 mvc
实现MVC的基本结构
在PHP中实现MVC(Model-View-Controller)模式,需要将应用程序分为三个核心部分:模型(Model)处理数据逻辑,视图(View)负责展示,控制器(Controller)协调模型和视图。
目录结构示例
app/
controllers/
HomeController.php
models/
UserModel.php
views/
home.php
index.php
创建控制器
控制器负责处理用户请求并调用相应的模型和视图。以下是一个简单的控制器示例:
// app/controllers/HomeController.php
class HomeController {
public function index() {
$model = new UserModel();
$users = $model->getUsers();
require 'app/views/home.php';
}
}
创建模型
模型负责与数据库交互并处理业务逻辑。以下是一个简单的模型示例:
// app/models/UserModel.php
class UserModel {
public function getUsers() {
// 模拟数据库查询
return [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob']
];
}
}
创建视图
视图负责展示数据。以下是一个简单的视图示例:

// app/views/home.php
<!DOCTYPE html>
<html>
<head>
<title>User List</title>
</head>
<body>
<h1>Users</h1>
<ul>
<?php foreach ($users as $user): ?>
<li><?php echo $user['name']; ?></li>
<?php endforeach; ?>
</ul>
</body>
</html>
入口文件
入口文件负责初始化应用程序并路由请求:
// index.php
require 'app/controllers/HomeController.php';
require 'app/models/UserModel.php';
$action = isset($_GET['action']) ? $_GET['action'] : 'index';
$controller = new HomeController();
$controller->$action();
路由改进
可以通过更灵活的路由机制来处理不同的控制器和动作:

// index.php
$controllerName = isset($_GET['controller']) ? $_GET['controller'] : 'Home';
$actionName = isset($_GET['action']) ? $_GET['action'] : 'index';
$controllerClass = $controllerName . 'Controller';
require "app/controllers/$controllerClass.php";
$controller = new $controllerClass();
$controller->$actionName();
自动加载类
使用spl_autoload_register避免手动包含每个类文件:
// index.php
spl_autoload_register(function ($className) {
$file = 'app/' . str_replace('\\', '/', $className) . '.php';
if (file_exists($file)) {
require $file;
}
});
$controllerName = isset($_GET['controller']) ? $_GET['controller'] : 'Home';
$actionName = isset($_GET['action']) ? $_GET['action'] : 'index';
$controllerClass = $controllerName . 'Controller';
$controller = new $controllerClass();
$controller->$actionName();
数据库连接
在模型中添加数据库连接逻辑:
// app/models/UserModel.php
class UserModel {
private $db;
public function __construct() {
$this->db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
}
public function getUsers() {
$stmt = $this->db->query('SELECT * FROM users');
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
错误处理
添加基本的错误处理机制:
// index.php
set_exception_handler(function ($e) {
error_log($e->getMessage());
header('HTTP/1.1 500 Internal Server Error');
echo 'An error occurred';
});
try {
// 原有的路由代码
} catch (Exception $e) {
throw $e;
}






