【发布时间】:2011-09-08 10:54:18
【问题描述】:
PHP 的 PDO 特性和DAO pattern 怎么可能混在一起呢?我应该有一个抽象类来初始化与数据库的连接吗? PDO 是否可以认为等同于 Java 的 JDBC?
【问题讨论】:
PHP 的 PDO 特性和DAO pattern 怎么可能混在一起呢?我应该有一个抽象类来初始化与数据库的连接吗? PDO 是否可以认为等同于 Java 的 JDBC?
【问题讨论】:
是的,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();
【讨论】:
getAllUsers、getUsersByLoginDate 或 getUsersByIP 之类的方法。
PHP 的 PDO 特性和 DAO 模式如何混用?
只需使用 pdo 对您的 dao 对象进行查询。
class PersonDAO {
function get($id) {
//> EXECUTE HERE PDO
}
}
而且 PDO 已经抽象了连接,所以你不需要一个抽象类来进行连接。
【讨论】: