Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对象之间的通信_Php - Fatal编程技术网

Php 对象之间的通信

Php 对象之间的通信,php,Php,我不知道这方面的最佳做法是什么。 假设我有一些层次对象: Neighborhood Family 所以每个家庭都住在附近。 对象映射如下: class Neighborhood { public $id; public $name; public $nr_families; } class Family { public $id; public $name; public $neighborhood_id; } class Neighborhood { p

我不知道这方面的最佳做法是什么。 假设我有一些层次对象:

Neighborhood
Family
所以每个家庭都住在附近。 对象映射如下:

class Neighborhood {
  public $id;
  public $name;

  public $nr_families;
}

class Family {
  public $id;
  public $name;
  public $neighborhood_id;
}
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;
    }
每个对象都为自己的数据库表建模。一个类型的所有对象都保存在全局scape中的一个数组中,因此有两个数组

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


有设计模式吗?我应该使用第三种对象吗?

如果不想使用额外的查询,需要在族列表上循环以检查族的邻域id。因为不鼓励使用全局变量,所以可以使用一些依赖项注入来告诉邻域有关族的信息

假设您的邻居对象具有包含族列表的静态变量。在对象外部,设置该变量:

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

这行吗?

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

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

class Neighborhood {
  public $id;
  public $name;

  public $nr_families;
}

class Family {
  public $id;
  public $name;
  public $neighborhood_id;
}
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;
    }

}

但是家庭的数量不能也是这个社区的财产吗?我不存储有关族对象的信息。当然,您可以延迟加载它-请参阅编辑的答案。至于邻里的家庭数量是通过财产还是访问器(getter)访问,谁在乎呢。访问器更灵活。