对象之间的通信


Communicating between Objects

我不知道最好的做法是什么。假设我有一些分层对象:

Neighborhood
Family

所以每个家庭都住在一个社区里。对象是这样映射的:

class Neighborhood {
  public $id;
  public $name;
  public $nr_families;
}
class Family {
  public $id;
  public $name;
  public $neighborhood_id;
}

每个对象建立自己的数据库表模型。在全局环境中,一个类型的所有对象都保存在一个数组中,因此有两个数组。

我怎么能知道,从内部邻居对象,在创建日期,有多少家庭在那个邻居,而不再次查询数据库或访问家庭的全局数组?假设首先生成了Family数组,它们已经在那里了,现在当我生成Neighborhood数组时,这些对象需要有一个包含每个家庭总数的属性。此属性与数据库字段不匹配,必须动态计算。

有设计模式吗?我要不要用第三人称?

如果不想使用额外的查询,则需要遍历家庭列表以检查家庭的社区id。因为不鼓励使用全局变量,所以您可以使用一些依赖注入来告诉邻居有关family的信息。

假设您的Neighborhood对象有一个包含家庭列表的静态变量。在你的对象之外,你设置这个变量:

Neighborhood::$families = $families;

Neighborhood现在可以遍历该列表,检查家庭的Neighborhood id:

class Neighborhood {
    function getNumberOfFamilies() {
        $myFamilies = array();
        foreach(self::$families as $family) {
            if($family->neighborhood_id === $this->id) {
                $myFamilies[] = $family
            }
        }
        $this->nr_families = count($myFamilies);
        return $families;
    }
}

可以吗?

欢迎来到对象关系映射的奇妙世界。

对象应该只"知道"自己(存储关于自己的属性)。为什么不这样做呢?

class Neighborhood {
    public $id;
    public $name;
    private $num_families;
    public function getNumFamilies() {
        if (!is_int($this->num_families)) {
            // do a database query
            $this->num_families = $result;
        }
        return $this->num_families;
    }

}