2012-10-11 45 views
2

我有点困惑如何在PHP中实现下面的OO结构。我有一个班'User'和班'UserGroup'a'用户'是一个'UserGroup'的一部分。在数据库中,用户表具有'user_group_id'字段。什么是一种好的和“服务器友好”的实现方式?我是否在我的用户类中创建UserGroup的实例,还是只将user_group_id保存在变量中?PHP OOP在实例中保存对象的实例还是只保存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

这就是所谓的两个实体之间的关系。 – mauris

+0

也许使用orm like“doctrine”或“propel” –

回答

3

这是典型的has-aUserUserGroup之间的关系。换句话说User有一个UserGroup。所以我认为类User应该参考UserGroup。如果您太担心和/或资源有限,您可以在User的实际需要中创建UserGroup的实例。

的实施,将是这样的:

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

谢谢!这个答案与@Ryan P的答案结合在一起使事情变得更加清晰。我的问题是我会做很多实际上相同的实例。但是使用静态数组可以解决这个问题。多谢你们! '您也可以在UserGroup类中使用静态数组来保存所有水合的UserGroup模型,因此如果多次请求同一个模型,则可以返回同一个实例。 – Mark

0

这是解决一个比较复杂的问题,但简单的答案是两者。数据库本身只能存储用户组ID,但是你的模型应该同时拥有。用户组ID应该从数据库中拉出,并且可以使用PHP魔术__get__set方法来加载在访问用户组模型,并从提交一个用户组的模型保存ID。

您也可以在UserGroup类中使用静态数组来保存所有水合的UserGroup模型,因此如果多次请求同一模型,则可以返回同一个实例。

编辑:由于德尔佩德罗在评论中指出,这之前已经(奥姆斯)来完成,你应该利用这个优势,如果它有利于你。

相关问题