结合PDO和DAO模式

时间:2011-06-04 17:13:59

标签: php pdo dao

PHP的PDO功能和DAO pattern如何混合?我应该有一个初始化数据库连接的抽象类吗? PDO可以被认为与Java的JDBC等效吗?

2 个答案:

答案 0 :(得分:6)

是的,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();

答案 1 :(得分:3)

  

PHP的PDO功能和DAO模式如何混合?

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

class PersonDAO {

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

}

此外,PDO已经抽象了连接,因此您不需要抽象类来进行连接。