当前位置:首页 > PHP

mvc实现 PHP

2026-02-14 09:25:40PHP

MVC 实现 PHP

MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。在 PHP 中实现 MVC 可以提高代码的可维护性和可扩展性。

mvc实现 PHP

项目结构

典型的 MVC 项目结构如下:

mvc实现 PHP

project/
├── app/
│   ├── controllers/
│   ├── models/
│   ├── views/
│   └── core/
├── public/
│   └── index.php
└── config/
  • controllers 处理用户请求和业务逻辑
  • models 负责数据操作和业务规则
  • views 负责展示数据
  • core 包含框架核心类如路由、数据库连接等
  • public 是入口文件和静态资源目录
  • config 存放配置文件

核心组件实现

路由系统

路由负责解析 URL 并调用相应的控制器和方法:

// core/Router.php
class Router {
    protected $routes = [];

    public function add($uri, $controller, $method) {
        $this->routes[$uri] = [
            'controller' => $controller,
            'method' => $method
        ];
    }

    public function dispatch($uri) {
        if (array_key_exists($uri, $this->routes)) {
            $controller = $this->routes[$uri]['controller'];
            $method = $this->routes[$uri]['method'];

            $controller = new $controller();
            $controller->$method();
        } else {
            throw new Exception("Route not found");
        }
    }
}

基础控制器

// core/Controller.php
class Controller {
    protected function view($view, $data = []) {
        extract($data);
        require_once "../app/views/$view.php";
    }

    protected function model($model) {
        require_once "../app/models/$model.php";
        return new $model();
    }
}

示例实现

模型示例

// models/User.php
class User {
    private $db;

    public function __construct() {
        $this->db = new Database(); // 假设已实现数据库类
    }

    public function getUsers() {
        $this->db->query("SELECT * FROM users");
        return $this->db->resultSet();
    }
}

控制器示例

// controllers/Users.php
class Users extends Controller {
    public function index() {
        $user = $this->model('User');
        $data = $user->getUsers();
        $this->view('users/index', $data);
    }
}

视图示例

<!-- views/users/index.php -->
<!DOCTYPE html>
<html>
<head>
    <title>Users</title>
</head>
<body>
    <h1>User List</h1>
    <ul>
        <?php foreach ($data as $user): ?>
            <li><?php echo $user['name']; ?></li>
        <?php endforeach; ?>
    </ul>
</body>
</html>

入口文件

// public/index.php
require_once '../app/core/Router.php';
require_once '../app/core/Controller.php';

$router = new Router();

// 添加路由
$router->add('/', 'Home', 'index');
$router->add('/users', 'Users', 'index');

$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$router->dispatch($uri);

数据库连接

// core/Database.php
class Database {
    private $host = DB_HOST;
    private $user = DB_USER;
    private $pass = DB_PASS;
    private $dbname = DB_NAME;

    private $stmt;
    private $dbh;

    public function __construct() {
        $dsn = "mysql:host={$this->host};dbname={$this->dbname}";
        $options = [
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ];

        try {
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    }

    public function query($sql) {
        $this->stmt = $this->dbh->prepare($sql);
    }

    public function bind($param, $value, $type = null) {
        if (is_null($type)) {
            switch (true) {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }
        $this->stmt->bindValue($param, $value, $type);
    }

    public function execute() {
        return $this->stmt->execute();
    }

    public function resultSet() {
        $this->execute();
        return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

自动加载

使用 Composer 的自动加载或实现简单的自动加载:

// autoload.php
spl_autoload_register(function($className) {
    $file = __DIR__ . '/../app/' . str_replace('\\', '/', $className) . '.php';
    if (file_exists($file)) {
        require $file;
    }
});

配置管理

// config/config.php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'mvc_app');

这个实现展示了 PHP 中 MVC 模式的基本结构。实际项目中可能需要更复杂的路由系统、中间件支持、依赖注入等高级功能。

标签: mvcPHP
分享给朋友:

相关文章

用vue实现mvc

用vue实现mvc

Vue 实现 MVC 模式 Vue 本身是一个 MVVM(Model-View-ViewModel)框架,但可以通过合理的架构设计实现 MVC(Model-View-Controller)模式。以下是…

PHP http长连接的实现

PHP http长连接的实现

HTTP 长连接基础概念 HTTP长连接(Keep-Alive)允许在单个TCP连接上发送和接收多个HTTP请求/响应,减少重复建立和断开连接的开销。HTTP/1.1默认启用长连接,而HTTP/1.0…

PHP实现会员管理

PHP实现会员管理

PHP实现会员管理的方法 数据库设计 创建会员表(members)包含字段:id(主键)、username、password(建议加密存储)、email、register_time、last_logi…

PHP实现图文聊天

PHP实现图文聊天

PHP实现图文聊天的方法 数据库设计 创建数据库表存储聊天消息,包含字段如消息ID、发送者ID、接收者ID、消息内容、消息类型(文本/图片)、发送时间等。使用MySQL或其他数据库管理系统。 CR…

PHP审核流程实现

PHP审核流程实现

PHP审核流程实现方法 审核流程的实现通常涉及状态管理、权限控制和操作记录。以下是几种常见的实现方式: 状态机模式 定义审核状态常量,使用状态机控制流程流转: const STATUS_PENDI…

PHP中实现重定向

PHP中实现重定向

PHP重定向的实现方法 在PHP中,重定向是通过发送HTTP头信息来实现的。以下是几种常见的重定向方法: 使用header()函数 header("Location: https://exampl…