【问题标题】:Binary Associations between PHP ClassesPHP 类之间的二进制关联
【发布时间】:2018-10-20 23:22:47
【问题描述】:

大家好,我有两个类,用户和购物车,它们对它们之间的二进制关联进行建模。为了实现它,我创建了两个类

一个用户类:

class User{
    protected $name ;
    protected $email;
    protected $shoppingCart;

    public function __construct($name , $email)
    {
        $this->name =$name;
        $this ->email =$email;
        $this->shoppingCart=new ShoppingCart($this);
    }

    //other getter and setter functions
}

class ShoppingCart{
    //Array stores the list of products in the cart:
    protected  $products = array();

    // For storing the IDs, as a convenience:
    protected $ids = array();

    // protected user    
    protected $user;

    // Constructor just sets the object up for usage:    
    function __construct($user) {
        $this->products = array();
        $this->ids = array();
        $this->user =$user;
    }

    // functions to add or delete item    
}

我的问题是,用户类和购物车类是否可以相互拥有一个实例,所以当我构造用户时,我在其构造函数中构造它的购物车。当我构建购物车时,我在购物车构造函数中传递用户信息以将购物车分配给用户。

我怎样才能正确地模拟这种关联。此外,我还必须访问用户购物车以从主 PHP 脚本显示其总价...在这种情况下,我还可以将用户类的 ShoppingCart 属性设为公开

【问题讨论】:

  • ShoppingCart 没有理由拥有用户的实例,因为您已经知道它属于哪个用户(因为它在用户对象中)。如果不访问用户对象,您甚至无法访问购物车。

标签: php oop


【解决方案1】:

循环依赖可能会导致很多挫败感。序列化变得复杂,深度克隆很奇怪,PHP 需要做更多的工作来垃圾收集它。

话虽如此,如果您意识到这些副作用,循环依赖就可以正常工作。其他常见的例子是 javascript DOM,其中每个元素都有对其子元素的引用,每个子元素都有对其父元素的引用。

我不同意评论者的说法:

ShoppingCart 没有理由拥有用户实例,因为您已经知道它属于哪个用户(因为它在用户对象中)。如果没有访问用户对象,您甚至无法访问购物车。

这在某些情况下可能是正确的,但并非普遍存在。我会同意,如果所有条件都相同,那么以不同的方式设计会稍微好一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多