我有点困惑如何在PHP中实现以下OO结构。我有一个班级“User
”和一个班级“UserGroup
”一个“用户”是一个“用户组”的一部分。在数据库中,用户表具有字段“user_group_id
”。什么是良好的“服务器友好”实现方式?我是在用户类中创建UserGroup的实例还是仅将user_group_id保存在变量中?
注意:并非所有方法都显示在示例中。
选项1
class User
{
private $userGroupId;
public function setGroupId($userGroupId)
{
$this->userGroupId = $userGroupId;
}
}
选项2
class User
{
private $userGroup;
public function setGroup($userGroupId)
{
$this->userGroup = new UserGroup($userGroupId);
}
}
我对选项2的问题是它可能会消耗更多的服务器资源,因为它为每个用户创建了一个全新的用户组实例。但我不确定这一点,我找不到任何关于此的信息。
我的问题:什么是良好的实施?
答案 0 :(得分:3)
这是User
和UserGroup
之间的典型 has-a 关系。换句话说,User
有一个UserGroup
。所以我认为课程User
应该引用UserGroup
。如果您太担心和/或资源有限,您可以在实际需要时在UserGroup
中创建User
的实例。
实施将类似于:
class User
{
private $userGroupId;
private $userGroup = null;
public function setGroupId($userGroupId)
{
$this->userGroupId = $userGroupId;
}
public function getGroup()
{
if ($this->userGroup === null)
{
$this->userGroup = new UserGroup($this->userGroupId);
}
return $this->userGroup;
}
}
答案 1 :(得分:0)
这是一个有点复杂的问题需要解决,但简短的回答是两者兼而有之。数据库本身只能存储用户组ID,但您的模型应该同时具有这两者。应从数据库中提取用户组ID,并且可以使用PHP magic __get
和__set
方法在访问时加载UserGroup模型,并在提交时保存UserGroup模型中的ID。
您还可以在UserGroup类中使用静态数组来保存所有水合UserGroup模型,因此如果多次请求相同的模型,则可以返回相同的实例。
编辑:正如Del Pedro在评论中指出的那样,这已经在(ORMs)之前完成,你应该利用它,如果它对你有利。