结合PDO和DAO模式

3
PHP的PDO功能和DAO模式如何结合?我是否需要一个抽象类来初始化到数据库的连接?PDO是否可以被视为Java的JDBC的等效物?
2个回答

6

是的,PDO在PHP中基本上相当于JDBC。

您应该在域对象的构造函数中传递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();

如果你需要将用户加入到另一个表中以获取更多信息,你会怎么做?你会创建一个代理类,比如Users,它有运行更复杂查询的方法吗?或者更简单地说,如果你想要检索所有用户而不仅仅是一个用户,该怎么办? - nagates
1
@NateGates 应用 DAO 模式,你可以为 User 设计相应的类,并拥有 getAllUsersgetUsersByLoginDategetUsersByIP 等方法。 - James P.

3
如何将PHP的PDO功能和DAO模式混合使用?
只需使用PDO将查询插入您的DAO对象即可。
class PersonDAO {

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

}

此外,PDO已经抽象了连接,因此您不需要为连接创建一个抽象类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接