如何写出关联,聚合和组合?

nev*_*ame 6 php oop

我已经阅读了一些关于这三种关系之间差异的帖子,我想我明白了.

我只是想知道,编码时所有这些都写得一样吗?

问题1:所有3只是实例变量中对象类型的值?

class A {
    public $b = ''

    public function __construct($object) {
         $this->b = $object // <-- could be a association, aggregation or a composition relation?
    }
}
Run Code Online (Sandbox Code Playgroud)

问题2:它必须是实例变量还是静态变量?

class A {
    public static $b = '' // <-- nothing changed?

    public function __construct($object) {
         $this->b = $object
    }
}
Run Code Online (Sandbox Code Playgroud)

问题3:对象的创建位置是否存在差异?

我倾向于认为组合对象是在对象内创建的:

class A {
    public $b = ''

    public function __construct() {
         $this->b = new Object // is created inside the object
    }
}
Run Code Online (Sandbox Code Playgroud)

和聚合/关联通过构造函数或其他方法传递:

class A {
    public $b = ''

    public function __construct($object) { // passed through a method
         $this->b = $object
    }
}
Run Code Online (Sandbox Code Playgroud)

问题4:为什么/什么时候知道这一点很重要.我是否必须在另一个对象内部评论它的关系,或者你在UML图中做什么?

有人可以解释这些问题吗?

小智 6

你是对的,这些通常被实现为对象引用,当然这通常只是某些类的成员字段.这只是因为它在面向对象的系统中很自然,它可以映射到不同上下文中的其他内容,例如关系数据库中的外键.

正如@erisco所提到的,关系的细节只能在整体模型的背景下进行.例如,我们可以读取采购订单和订单行之间的组合关系(例如):采购订单包含一个或多个订单行.

我通常会解释你给出的三个如下:

  1. 协会:A 知道 B,B本身就有意义.
  2. 聚合:A 包括 B,B是外部可识别的,并且可以根据其自身的优点存在.
  3. 组合物:A 包含 B,B不是外部可识别的或在该组合物之外没有含义.

也就是说,我已经看到这些曾经意味着几乎所有可以想到的东西(并且很可能是SO上的人会不同意我的评估!)所以在解释别人的图时要小心:-)上述惯例有我很好,但是YMMV.

问题2:静态引用将产生跨实例的公共关联,但它只是实现它的一种方式,并且可能令消费者感到惊讶.