pro*_*ort 9 php oop composition
我想使用PHP实现图的下一个片段.
请参阅下面的组成示例图:
我们可以使用内部类在Java中实现组合.
但PHP中没有"内部类"的类比.当然,还有一些特点.但是我们可以在多个班级中使用它.
我已经实现了这样的组合:
class Head {
private static $instance = NULL;
private function __construct(){}
public static function getInstance() {
$traces = debug_backtrace();
if (strcmp($traces[1]['class'], 'Human')) {
echo "<br>Only human has head"; // Exception can be thrown here
return NULL;
}
if (!static::$instance) static::$instance = new self();
return static::$instance;
}
public function __toString() {
return 'Head';
}
}
class Human {
private $head;
public function __construct() {
$this->head = Head::getInstance();
}
public function __toString() {
return 'I have ' . $this->head;
}
}
class Plant {
private $head;
public function __construct() {
$this->head = Head::getInstance();
}
}
$human = new Human();
echo $human;
$superman = new Plant();
Run Code Online (Sandbox Code Playgroud)
这样做是对的吗?
有没有更好的方法在PHP中实现组合关系?
ter*_*ško 25
看起来你是真正的困惑是什么"成分"是OOP.
组合是两个类之间的关联,其中,对于要实例化的第一个类的实例,必须为它提供第二个类.在您Human存在的特定图表中,它需要一个Head.在代码中它将是:
class Head {
}
class Human {
private $head;
public function __construct(Head $head) {
$this->head = $head;
}
}
$bob = new Human(new Head);
Run Code Online (Sandbox Code Playgroud)
就是这样.没有debug_backtrace(),也没有单身反模式.而且,顺便说一句,这在Java中看起来几乎完全相同,即使有内部类的选项.
至于你发布的代码.这是错误的:
if (strcmp($traces[1]['class'], 'Human')) {
echo "<br>Only human has head"; // Exception can be thrown here
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
该图并没有说只有人类才有头脑.只有那个人必须有头才能被实例化.你也可以$skipper = new Dog(new Head);,这完全没问题.
组合优于继承。
基本上组合是一种更强的聚合形式。我们可以说身体和头之间的关系是组合,因为我们不能没有头,但身体和手之间的关系是聚合,因为我们可以失去手但我们可以活着。还有直接关联和临时关联等较弱的关系。
然而,依赖注入只是我们创建这些关联的一种模式(通过将一个类注入到另一个类中)。
在大多数情况下,您可以通过构造函数识别组合关系,该构造函数注入另一个对象并将其分配给其属性,对象的生命周期结束并在同一时刻开始。
除此之外,从技术角度来看,每个关联的实现之间没有太大区别。这主要是关系定义而不是实现的问题。
组合关系通常用于覆盖/更改或增强注入的对象类行为。不要太兴奋或担心构图。在大多数情况下,与继承相比的优势很小,并且最受第三方库创建者的欢迎,他们使用组合为其库增加了额外的灵活性。
从父类继承和重载/添加方法为我们提供了类似的功能,但通过组合我们获得了更大的灵活性。例如,如果我们的构造函数接受从 Head 接口继承的对象,我们可以使用 HumanHead 类,如果它扩展 Head 接口,但我们也可以使用我们的类来增强从相同接口扩展的其他生物,如 DogHead 或 DuckHead...
这可能不是最好的例子,但它显示了基本概念。
请务必检查此[Aggregation vs Composition vs Association vs Direct Association]和此[Association-Aggregation-Composition-Dependency]。