Я вижу, что композитный шаблон и зависимость от инъекций
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
.
В случае, если связанный пример не работает, вот код из ссылки (Dario Ocles, 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\'ma 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\'ma 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(); ?>
с<?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\'ma 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\'ma 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
.
Отказ от ответственности : всякий кредит для вышеуказанной программы относится к ее оригинальным авторам.