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)访问,谁在乎呢。访问器更灵活。