当前位置:首页 > 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实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php 实现秒杀

php 实现秒杀

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

php实现博客

php实现博客

使用PHP实现博客系统 数据库设计 创建数据库表存储博客文章和用户信息。常见的表包括posts(文章)和users(用户)。 CREATE TABLE users ( id INT AUT…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $…