在对象之间进行通信

时间:2011-07-26 14:32:54

标签: php

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

Neighborhood
Family

所以每个家庭都住在一个社区。 对象映射如下:

class Neighborhood {
  public $id;
  public $name;

  public $nr_families;
}

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

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

我怎么知道,在邻居对象中,在创建日期,有多少家庭在那个社区,没有再次查询数据库或访问全局家庭数组?假设Family数组首先生成,它们已经存在,现在当我生成Neighborhood数组时,这些对象需要具有一个属性,其中包含每个数组中的族数。此属性与数据库字段不匹配,必须立即计算。

有设计模式吗?我应该使用某种第三种物体吗?

2 个答案:

答案 0 :(得分:1)

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

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

Neighborhood::$families = $families;

邻居现在可以遍历该列表,检查家庭的邻居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;
    }
}

那会有用吗?

答案 1 :(得分:1)

欢迎来到对象关系映射的精彩世界。

对象应该“知道”(仅存储属性)本身。为什么不这样做:

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;
    }

}