oop — Как реализовать композицию в Stack Overflow

Я хочу реализовать следующий фрагмент диаграммы, используя 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();

Правильно ли это делать?

Есть ли лучший способ реализовать композиционные отношения в PHP?

7

Решение

Похоже, ты действительно запутался в том, что такое «композиция» в ООП.

Композиция — это связь между двумя классами, где для экземпляра первого класса, который должен быть создан, обязательно предоставить ему второй класс. В тебе конкретная схема для Human чтобы существовать, это требует Head, В коде это будет:

class Head {
}

class Human {
private $head;
public function __construct(Head $head) {
$this->head = $head;
}
}

$bob = new Human(new Head);

И это все. нет debug_backtrace() и не синглтон анти-модель требуется. И, кстати, это будет выглядеть почти точно так же и в Java, даже с возможностью иметь внутренние классы.

Что касается вашего размещенного кода. Это было бы неправильно:

if (strcmp($traces[1]['class'], 'Human')) {
echo "<br>Only human has head"; // Exception can be thrown here
return NULL;
}

На диаграмме не сказано, что голова есть только у людей. Только этот человек должен иметь голова, которую нужно создать. Вы также можете иметь $skipper = new Dog(new Head);, что было бы прекрасно.

18

Другие решения

Композиция по наследству.

В принципе состав это более сильная форма агрегирование. Мы могли бы сказать, что отношения между телом и головой являются композицией, потому что мы не можем жить без головы, но отношения между телом и рукой — это совокупность, потому что мы можем потерять руку, но мы можем остаться в живых. Есть также более слабые отношения, такие как прямая ассоциация а также временная ассоциация.

Однако внедрение зависимостей — это просто шаблон, в котором мы создаем эти ассоциации (путем внедрения одного класса в другой).

В большинстве случаев вы можете распознать композиционные отношения с помощью конструктора, который внедряет другой объект и присваивает его свойству, а жизненный цикл объекта заканчивается и начинается в тот же момент.

Кроме того, с технической точки зрения, между реализацией каждой ассоциации нет большой разницы. Это в основном вопрос определения отношений, а не реализации.

Композиционные отношения часто используются для перезаписи / изменения или улучшения поведения класса внедренных объектов. Не слишком волнуйтесь и не переживайте по поводу композиции. В большинстве случаев преимущества по сравнению с наследованием невелики, и ими больше всего пользуются сторонние создатели библиотек, которые используют композицию для повышения гибкости своих библиотек.

Наследование от родительского класса и методы перегрузки / добавления дают нам аналогичную функциональность, но с композицией мы получаем большую гибкость. Например, если наш конструктор принимает объект, который наследуется от интерфейса Head, мы можем использовать класс HumanHead, если он расширяет интерфейс Head, но мы также можем использовать наш класс для улучшения других существ, которые расширяются из того же интерфейса, как DogHead или DuckHead …

Это, возможно, не лучший пример, но он показывает основную концепцию.

Обязательно проверьте это [Агрегация против состава против ассоциации против прямой ассоциации] и это [Ассоциация-Агрегация-Состав-зависимостей].

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector