php mvc实现
PHP MVC 实现步骤
模型(Model)层
模型负责数据处理和业务逻辑,通常与数据库交互。创建一个基类模型,其他具体模型继承它。
class Model {
protected $db;
public function __construct() {
$this->db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
}
}
class UserModel extends Model {
public function getUsers() {
$stmt = $this->db->query("SELECT * FROM users");
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
视图(View)层
视图负责展示数据,通常是HTML模板文件。通过简单的变量替换实现数据渲染。
class View {
public function render($template, $data = []) {
extract($data);
include "views/$template.php";
}
}
// 使用示例
$view = new View();
$view->render('user_list', ['users' => $users]);
控制器(Controller)层
控制器处理用户请求,协调模型和视图。创建基础控制器类,其他控制器继承它。
class Controller {
protected $model;
protected $view;
public function __construct() {
$this->view = new View();
}
}
class UserController extends Controller {
public function __construct() {
parent::__construct();
$this->model = new UserModel();
}
public function index() {
$users = $this->model->getUsers();
$this->view->render('user_list', ['users' => $users]);
}
}
路由处理
创建路由机制将URL映射到对应的控制器和方法。
class Router {
public function route() {
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segments = explode('/', trim($uri, '/'));
$controllerName = !empty($segments[0]) ? ucfirst($segments[0]) . 'Controller' : 'HomeController';
$action = !empty($segments[1]) ? $segments[1] : 'index';
if (class_exists($controllerName)) {
$controller = new $controllerName();
if (method_exists($controller, $action)) {
$controller->$action();
} else {
http_response_code(404);
echo "Action not found";
}
} else {
http_response_code(404);
echo "Controller not found";
}
}
}
$router = new Router();
$router->route();
目录结构
典型的MVC目录结构如下:
app/
controllers/
UserController.php
models/
UserModel.php
views/
user_list.php
public/
index.php
入口文件
public/index.php 是应用的单一入口点:
require_once '../app/bootstrap.php';
$router = new Router();
$router->route();
自动加载
使用Composer的自动加载功能或实现简单的自动加载:
spl_autoload_register(function ($class) {
$file = '../app/' . str_replace('\\', '/', $class) . '.php';
if (file_exists($file)) {
require $file;
}
});




