当前位置:首页 > 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 实现页面跳转的方法 在 PHP 中实现页面跳转有多种方式,以下是常见的几种方法及其适用场景: 使用 header() 函数 通过 header() 函数发送 HTTP 头部信息实现跳转。注意…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php 无限分类的实现

php 无限分类的实现

无限分类的实现方法 无限分类通常用于构建树形结构数据,如商品分类、多级菜单等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 邻接列表是最简单的实现方式,通过在每个节点中存…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…