PHP OOP在实例中保存对象的实例还是仅保存id?

时间:2012-10-11 14:53:09

标签: php oop instance

我有点困惑如何在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的问题是它可能会消耗更多的服务器资源,因为它为每个用户创建了一个全新的用户组实例。但我不确定这一点,我找不到任何关于此的信息。

我的问题:什么是良好的实施

2 个答案:

答案 0 :(得分:3)

这是UserUserGroup之间的典型 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)之前完成,你应该利用它,如果它对你有利。