我有一个关于如何从数据库填充对象的问题,它更多的是关于体系结构而不是自己填充它。
假设我有一个名为收据的表格,其中包含:receipt_id,user_id,issue_date,business_id,product_id abd type。
现在我想创建一个将从该表填充的Receipt类,我会这样做:
class Receipt {
public function __construct($receipt_id = null) {
if(!is_null($receipt_id))
$this->populate($receipt_id);
}
public function populate($receipt_id){
//Get data from data base
}
public function save(){
//Saves the current receipt into the data base.
}
public static function getReceiptsFromUser($user_id){
}
}
我的问题是关于getReceiptsFromUser,它应该是静态的吗?对于User类来说,有一个名为getReceipts的方法是有意义的,它会返回一个调用这个静态方法的收据对象数组。我认为它应该是静态的,因为创建空收据以生成用户的收据没有任何意义。这个架构中存在任何缺陷或更好的方法吗?
答案 0 :(得分:0)
是的,它应该是静态的。正如您自己已经提到的那样,您不需要Receipt对象来检索其他收据。
将类属性或方法声明为静态使它们可以访问,而无需实例化类。
顺便说一句,你在这里做的是Active Record pattern。如果您打算使用这种方法,最好创建一个定义共享方法的基类(可以称之为Record
或类似的东西)(例如save
,{{1等等,让你的模型扩展它们(find
,class Receipt extends Record
等)。这样,您无需在所有模型中重复此代码。
这种方法的一个很好的(PHP)示例由PHP ActiveRecord project给出。查看他们的文档应该会给你一些关于它如何工作的想法。
另一种方法是Data Mapper pattern。好处是您的模型不知道如何保存它们,因此您可以非常灵活地保留数据的持久性,而不是受限于ActiveRecord的限制。