用从数据库中提取的属性填充对象的最佳方式


Best way to populate an object with properties pulled from a database

我使用的是PHP 5.4。我正在努力使我的申请更加扎实。我目前正在检查我的对象,并确保它们遵循SRP。我一直纠结于如何用属性填充对象,尤其是"扩展"对象属性的属性。让我更好地解释一下。

我有一个班叫Flock(是的,一群鸡——我在农业)。它由数据库中flocks表中的几个属性组成:idmember_idintegrator_iddate_placeddate_picked_up等:

<?php
class Flock
{
    private $id;
    private $member_id;
    private $farm_id;
    private $integrator_id;
    private $comments;
    private $production_sq_ft;
    private $number_of_houses;
    private $avg_effective_age_of_houses;
    private $date_placed;
    private $date_picked_up;
    private $head_started;
    private $head_picked_up;
    private $pounds_picked_up;
    private $pounds_sold;
    private $base_rate;
    private $performance_rate;
    private $fuel_rate;
    private $other_rate;
    private $feed_pounds_consumed;
    public function __construct() {}
    //Then a bunch of getters and setters.
}

我的目标是使用相同的对象来创建和检索羊群。但是,在我的数据库中,我创建了几个"主"视图,这些视图将所有查找表连接在一起,并对数据执行任何可以在行级别执行的基本计算。在本例中,在我的羊群主视图中,我已经将integrators表与flocks连接起来,从而在视图中获得了integrator_name列。membersfarms表也是如此。我还发现了date_placeddate_picked_up之间的天数差异,这给了我一个名为total_time_in_facility的专栏。在我当前版本的这个应用程序中,所有这些数据都简单地存储在一个数组中,并使用魔术方法(__get)进行访问。因此,如果我想获得积分器名称,我只需使用$flock->integrator_name。但是,如果我使用Flock类来填充数据库,我不会传递积分器名称——我只会传递上面列出的值。

我的问题是——获得关于羊群的扩展数据的最佳方法是什么?我是否应该使用另一个类来处理此问题(如FlockDetails)?我应该根本不使用这个主视图吗?在我看来,我不应该执行任何计算,而应该只是在类本身中执行这些计算吗?我的印象是,我应该只用一个类来描述一大群人。如果我要创建一个新的群体,我会使用这个类。如果我想在上检索,我会简单地使用工厂来填充它。但是,如果我使用工厂填充它,那么主视图中包含的其他详细信息呢?有人能帮我清理一下吗?谢谢

好吧,我可能有一个Flock类,它表示表"flocks"中的一行,还有FlockEx类,它通过添加在db中计算得到的字段来扩展Flock类。因此,当你想更新或添加一个新的羊群到数据库时,你可以使用flock类,当你检索羊群字段和计算的字段时,你会使用FlockEx。有道理吗?