当前位置:首页 > PHP

php 实现dao模式

2026-02-16 20:47:25PHP

PHP 实现 DAO 模式

DAO(Data Access Object)模式是一种用于抽象和封装数据访问逻辑的设计模式,将底层数据操作与业务逻辑分离。以下是 PHP 中实现 DAO 模式的详细方法。

定义数据模型类

创建一个简单的数据模型类,表示业务实体。例如,用户模型:

php 实现dao模式

class User {
    private $id;
    private $name;
    private $email;

    public function __construct($id, $name, $email) {
        $this->id = $id;
        $this->name = $name;
        $this->email = $email;
    }

    public function getId() { return $this->id; }
    public function getName() { return $this->name; }
    public function getEmail() { return $this->email; }
}

创建 DAO 接口

定义 DAO 接口,声明通用的数据访问方法:

interface UserDao {
    public function findById($id);
    public function findAll();
    public function save(User $user);
    public function update(User $user);
    public function delete($id);
}

实现具体 DAO 类

基于接口实现具体的 DAO 类,例如 MySQL 实现:

php 实现dao模式

class UserDaoImpl implements UserDao {
    private $db;

    public function __construct(PDO $db) {
        $this->db = $db;
    }

    public function findById($id) {
        $stmt = $this->db->prepare("SELECT * FROM users WHERE id = :id");
        $stmt->execute([':id' => $id]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return new User($row['id'], $row['name'], $row['email']);
    }

    public function findAll() {
        $stmt = $this->db->query("SELECT * FROM users");
        $users = [];
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $users[] = new User($row['id'], $row['name'], $row['email']);
        }
        return $users;
    }

    public function save(User $user) {
        $stmt = $this->db->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
        $stmt->execute([
            ':name' => $user->getName(),
            ':email' => $user->getEmail()
        ]);
        return $this->db->lastInsertId();
    }

    public function update(User $user) {
        $stmt = $this->db->prepare("UPDATE users SET name = :name, email = :email WHERE id = :id");
        $stmt->execute([
            ':id' => $user->getId(),
            ':name' => $user->getName(),
            ':email' => $user->getEmail()
        ]);
    }

    public function delete($id) {
        $stmt = $this->db->prepare("DELETE FROM users WHERE id = :id");
        $stmt->execute([':id' => $id]);
    }
}

使用工厂模式创建 DAO 实例

通过工厂类集中管理 DAO 实例的创建:

class DaoFactory {
    private static $db;

    public static function setDb(PDO $db) {
        self::$db = $db;
    }

    public static function getUserDao() {
        return new UserDaoImpl(self::$db);
    }
}

实际调用示例

在业务逻辑中使用 DAO:

$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
DaoFactory::setDb($db);

$userDao = DaoFactory::getUserDao();

// 创建用户
$newUser = new User(null, 'John Doe', 'john@example.com');
$userId = $userDao->save($newUser);

// 查询用户
$user = $userDao->findById($userId);
echo $user->getName();

// 更新用户
$user->setName('Jane Doe');
$userDao->update($user);

// 删除用户
$userDao->delete($userId);

优势与扩展性

DAO 模式的主要优势在于将数据访问逻辑与业务逻辑解耦。如果需要更换数据库(如从 MySQL 迁移到 PostgreSQL),只需实现新的 DAO 类并修改工厂方法,无需改动业务代码。同时,便于单元测试,可以通过 Mock 对象替换实际 DAO 实现。

标签: 模式php
分享给朋友:

相关文章

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_I…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php实现静态

php实现静态

静态化实现方法 PHP实现静态化主要通过生成HTML文件或缓存机制来减少服务器动态解析的开销。以下是几种常见方法: 生成静态HTML文件 通过file_put_contents()将动态内容保存为H…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…