2012-10-11 66 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模型,因此如果多次請求同一模型,則可以返回同一個實例。

編輯:由於德爾佩德羅在評論中指出,這之前已經(奧姆斯)來完成,你應該利用這個優勢,如果它有利於你。

相關問題