结合 PDO 和 DAO 模式

Posted

技术标签:

【中文标题】结合 PDO 和 DAO 模式【英文标题】:Combining PDO and DAO pattern 【发布时间】:2011-09-08 10:54:18 【问题描述】:

php 的 PDO 特性和DAO pattern 怎么可能混在一起呢?我应该有一个抽象类来初始化与数据库的连接吗? PDO 是否可以认为等同于 Java 的 JDBC?

【问题讨论】:

【参考方案1】:

是的,PDO 几乎是 JDBC 的“等价物”,但在 PHP 中。

您应该在域对象的构造函数中传递一个 PDO 实例(依赖注入):

abstract class Object 
    protected $_pdo;

    protected $_target;

    public function __construct(PDO $pdo) 
        $this->_pdo = $pdo;
    

    public function load($id) 
        // $this->_pdo->something()
    

    public function save() 
        // $this->_pdo->something()
    

    public function delete() 
        // $this->_pdo->something()
    


class User extends Object 
    protected $_target = 'user_table';

    public $name;

然后:

$pdo = new PDO('mysql:dbname=foobar');
$user = new User($pdo);
$user->name = 'netcoder';
$user->save();

您还可以在Object 中添加静态方法来指定默认实例:

class Object 
    // ...

    static protected $_defaultPDO;

    static public function setDefaultPDO(PDO $pdo) 
        self::$_defaultPDO = $pdo;
    

    public function __construct(PDO $pdo = null) 
        if (!isset($pdo)) $pdo = self::$_defaultPDO;
        if (!isset($pdo))
            throw new DomainException('No default PDO object defined');

        $this->_pdo = $pdo;
    


Object::setDefaultPDO(new PDO('mysql:dbname=foobar'));
$user = new User;
$user->name = 'James P.';
$user->save();

【讨论】:

如果假设您需要将用户加入到附加表以获取更多信息,您会怎么做,您会创建一个代理类(例如用户),它具有运行更复杂查询的方法,或者我想更简单的是,如果您想撤回所有用户,而不仅仅是一个? @NateGates 应用 DAO 模式,您可以为 User 提供相应的类,并拥有诸如 getAllUsersgetUsersByLoginDategetUsersByIP 之类的方法。【参考方案2】:

PHP 的 PDO 特性和 DAO 模式如何混用?

只需使用 pdo 对您的 dao 对象进行查询。

class PersonDAO 

   function get($id) 
     //> EXECUTE HERE PDO
   


而且 PDO 已经抽象了连接,所以你不需要一个抽象类来进行连接。

【讨论】:

以上是关于结合 PDO 和 DAO 模式的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试将 PDO 和 OOP 结合起来,但无法正常工作

将 PDO 与 MS SQL 结合使用“活动结果不包含任何字段”

Java01-接口(DAO模式代码阅读及应用)

策略模式和简单工厂模式的结合使用

数据库抽象层PDO 8-1

结合 JPA、EJB 和 JSF 托管 bean 的首选设计模式是啥?