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

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

【问题讨论】:

    标签: php pdo dao


    【解决方案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 已经抽象了连接,所以你不需要一个抽象类来进行连接。

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 2023-03-03
      • 2013-07-12
      • 1970-01-01
      相关资源
      最近更新 更多