当前位置:首页 > PHP

php 实现dao模式

2026-02-16 20:47:25PHP

PHP 实现 DAO 模式

DAO(Data Access Object)模式是一种用于抽象和封装数据访问逻辑的设计模式,将底层数据操作与业务逻辑分离。以下是 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 实现:

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:

php 实现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实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebSo…

php实现接口

php实现接口

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

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php实现一个

php实现一个

PHP 实现一个简单的计算器 创建一个基本的计算器,支持加、减、乘、除运算。以下是一个完整的实现代码示例: <?php $result = ""; if ($_SERVER["REQUEST_…