Php 如何编写关联、聚合和组合?

Php 如何编写关联、聚合和组合?,php,oop,Php,Oop,我读过一些关于这三种关系之间差异的帖子,我想我明白了 我只是想知道,在编写代码时,所有这些都是一样的吗 问题1:所有3个都只是实例变量中对象类型的值 class A { public $b = '' public function __construct($object) { $this->b = $object // <-- could be a association, aggregation or a composition relation

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

我只是想知道,在编写代码时,所有这些都是一样的吗

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

class A {
    public $b = ''

    public function __construct($object) {
         $this->b = $object // <-- could be a association, aggregation or a composition relation?
    }
}
聚合/关联通过构造函数或其他方法传递:

class A {
    public $b = ''

    public function __construct($object) { // passed through a method
         $this->b = $object
    }
}
问题4:为什么/什么时候知道这一点很重要。我是否必须在另一个对象中注释一个对象,它是关于什么关系的,还是在UML图中进行注释


有人能解释一下这些问题吗?

可能有你最好的定义。您的示例中没有一个区分关联、聚合或组合。没有对A是什么或B是什么的任何定义,就没有对它们之间关系的定义。如何获得对另一个对象的引用与类图无关。

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

正如@erisco所提到的,关系的细节只能在整体模型的上下文中考虑。例如,我们可以这样读取采购订单和订单行之间的组合关系(例如):采购订单包含一个或多个订单行

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

  • 联想:A知道B,B本身就有意义
  • 聚合:A包括B,B是外部可识别的,可能存在于其自身
  • 组成:A由B组成,B在外部不可识别或在本组成之外没有意义
  • 这就是说,我看到这些过去几乎意味着任何可以想象出来的东西(很可能有人会不同意我的评估!),所以在解释其他人的图表时要小心:-)上述惯例对我很有用,但YMMV

    关于问题2:静态引用会产生跨实例的公共关联,但这只是实现这种关联的一种方法,可能会让消费者感到惊讶。

    如在php.net中:

    关联是由独立构造和外部可见的部分组成。当我们关联类或对象时,每个类或对象都会保留一个对其关联对象的引用

    当我们静态地关联类时,一个类将包含对另一个类实例的引用

    我们还可以在运行时通过在构造函数(或任何其他方法)中传递引用来关联实例,这允许我们动态更改对象之间的关联关系


    因此,语言本身无法解释两个对象之间的关系。它只显示在UML图中,以便我们程序员理解这些对象之间的关系,对吗?因为我只是想知道是否有一种特定的方式来编码这些关系,但似乎不是这样。这些关系应该在代码中作为注释输入,还是仅在UML中输入?参见本文:
    class A {
        public $b = ''
    
        public function __construct() {
             $this->b = new Object // is created inside the object
        }
    }
    
    class A {
        public $b = ''
    
        public function __construct($object) { // passed through a method
             $this->b = $object
        }
    }