php 实现dao模式
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:
$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 实现。






