Концепцией, которую вы можете попытаться применить, является Композиция над наследованием .
Решением может быть компоновка текущего объекта Mold
и передача двух экземпляров плагинов так, чтобы онможет использовать их в своих методах, например так:
<?php
class Mold {
public $current;
public function __construct(Plugin1 $plugin1, Plugin2 $plugin2) {
$this->plugin1 = $plugin1;
$this->plugin2 = $plugin2;
}
public function merge($first, $second) {
$this->current = $first . $second;
return $this;
}
public function phone() {
$this->current = '<a href="tel:' . $this->current . '">' . $this->current . '</a>';
return $this;
}
public function __toString() {
return $this->current;
}
public function link() {
$this->plugin1->link();
return $this;
}
}
function mold() {
return new Mold(new Plugin1(), new Plugin2());
}
Другим решением может быть создание некоторого класса MoldHandler
, который имеет объект Mold
в качестве свойства вместе с другими плагинами,который может быть использован внутри этого непосредственно.
public class MoldHanlder {
protected $mold;
protected $plugin1;
protected $plugin2;
public function __contruct($mold, $plugin1, $plugin2) {
$this->mold = $mold;
$this->plugin1 = $plugin1;
$this->plugin2 = $plugin2;
}
public function merge() {
$this->mold = $this->mold->merge();
return $this;
}
public function link() {
$foo = $this->plugin1->method();
return $this;
}
...
}
Вы также можете просто создать экземпляры классов внутри construct
, но если вы планируете писать модульные тесты, внедрение зависимостей - это путь
Я думаю, что первый подход намного лучше, потому что вы избегаете переписывания некоторого кода класса Mold, который не нужен
NB. Это действительно грубое решение, предложенное просто для того, чтобы вы лучшепонять идею, я бы выбрал ура