Я вижу, что составной шаблон и внедрение зависимостей означает
public function __construct(ClassToUseInterface $class) {
$this->class = $class
}
Так в чем же разница?
Код, представленный в вашем вопросе, не представляет внедрение зависимостей и не представляет составной шаблон. Ваш код представляет то, что известно как Инверсия зависимостей. Давайте ответим на ваш вопрос:
Dependency injection
это позвонить construct
функция из кода, который является внешним по отношению к классу, в котором construct
метод определяется, передавая ему конкретный объект, который реализует ClassToUseInterface
, Внешний код называется впрыскивать зависимость и поэтому известна как Dependency injection
,IS-A
и HAS-A
отношения в то же время с class
или же interface
что он распространяется или реализует. Это позволяет группе объектов класса вести себя так, как если бы они представляли один объект класса. Поскольку я не знаком с php
синтаксис, Вот хороший пример Composite pattern
в php
, В этом примере draw
метод в Container
класс действует на группу Graphic
объекты. Для звонящего это как будто draw
функция была вызвана на один Graphic
объект.
В случае, если связанный пример не работает, вот код из ссылки (Дарио Оклес; 18 июня 2007 г.)
<?php
abstract class Graphic{
abstract public function draw();
}
class Triangle extends Graphic{
private $name = '';
public function __construct($name = 'unknown'){
$this->name = $name;
}
public function draw(){
echo '-I\'m a triangle '.$this->name.'.<br>';
}
}
class Container extends Graphic{
private $name = '';
private $container = array();
public function __construct($name = 'unknown'){
$this->name = $name;
}
public function draw(){
echo 'I\'m a container '.$this->name.'.<br>';
foreach($this->container as $graphic)
$graphic->draw();
}
public function add(Graphic $graphic){
$this->container[] = $graphic;
}
public function del(Graphic $graphic){
unset($this->container[$graphic]);
}
}
$tri1 = new Triangle('1');
$tri2 = new Triangle('2');
$tri3 = new Triangle('3');
$container1 = new Container('1');
$container2 = new Container('2');
$container3 = new Container('3');
$container1->add($tri1);
$container1->add($tri2);
$container2->add($tri3);
$container3->add($container1);
$container3->add($container2);
$container3->draw();
?>
В приведенном выше примере $container3->add($container1);
проходит Container
возражать против другого объекта Container
, Это снова будет называться dependency injection
, Отказ от этого заключается в том, что dependency injection
а также composite pattern
не значит то же самое. composite
объект может быть передан как dependency
, composite
объект не такой как dependency injection
,
отказ : Вся заслуга вышеупомянутой программы принадлежит ее оригинальным авторам.
Других решений пока нет …