【发布时间】:2012-01-19 17:46:10
【问题描述】:
我最近使用数据库对象超类完成了一些项目,我使用该超类进行快速的一次性记录查询/更新,并使用适当的类进行扩展,例如用户类。
我发现我正在编写的许多类都有完全相同的方法:query_values()、update()、delete() 等。
所以我想出了一个带有如下构造函数的类:
public function __construct($table, $db_object, $record_id = null){
$this->db = $db_object; // Database object with query methods
$this->table = $table; // The name of the database table
$this->get_column_data();
if(!is_null($record_id)){
// This retrieves all column values,
// stores into private $fields array property
$this->query_values($record_id);
}
}
子类构造函数如下所示:
public function __construct($db_object, $record_id = null){
parent::__construct($this->table, $db_object, $record_id);
}
$table 属性定义在顶部,因为我们应该知道这个特定对象使用哪个表。
现在,所有常见的记录管理方法都在一个地方,特定于类的方法都在它们各自的子类中定义。
我在这里看到的最大缺点是所有数据字段都被提取并封装在 $fields 属性中,因此需要定义通用 get 和 set 方法(我通常这样做),这几乎否定了封装*,或者必须为我们要公开的每个属性专门定义一个方法。
*示例: $user_id = $User->id; // 不使用我的方法 对比 $user_id = $User->_get('id'); // 访问 $User->fields['id']
您认为这是缺点还是优点?目标是易于使用、面向对象(封装),而且非常棒!
【问题讨论】:
-
成就解锁:直观实现Row Data Gateway Pattern
-
@Gordon - 谢谢 Gordon,这验证了我的想法!