실생활의 예를 살펴 보겠습니다. 차를 가지고 있다고 가정 해 봅시다. 자동차에는 엔진이 필요합니다.
class Car
{
private $engine;
public function __construct()
{
$this->engine = new V6Engine();
}
}
자동차는 엔진에 종속되어 있습니다. 이 경우, 자동차 자체가 새로운 엔진을 구성해야합니다! 의미가 있습니까? 음 .. 안돼! 또한 자동차는 특정 버전의 엔진에 연결됩니다.
이 말이 더 합리적입니다. 다른 사람이 자동차 엔진을 제공해야합니다. 그것은 일부 엔진 공급 업체, 엔진 공장 일 수 ... 그것은 엔진을 만드는 자동차의 직업이 아닙니다!
class Car
{
private $engine;
public function __construct(Engine $engine)
{
$this->engine = new $engine;
}
}
interface Engine
{
public function start();
}
class V6Engine implements Engine
{
public function start()
{
echo "vrooom, vrooom V6 cool noise"
}
}
또한 엔진을 쉽게 바꿀 수 있으며 특정 엔진에 연결되어 있지 않을 수 있습니다. 그 새로운 엔진은 시작할 수 있어야합니다.
마틴 파울러 (Martin Fowler)는 제어 및 의존성 주입의 반전에 대해 매우 좋은 기사를 작성했습니다.
https://martinfowler.com/articles/injection.html
그것을 읽어 보시기 바랍니다 - 나는) : 할 수있는 것보다 그가 훨씬 더 DI를 설명하기 때문에)
는 또한, Miško Hevery "깨끗한 코드 회담에서 아주 좋은 비디오가 - 사물을 보지 마라! ". 당신은 그것을보고 후 더 영리 할 것이다 : 나는 당신의 서비스 내에서 객체를 생성하는 서비스의 범위를 숨기는 것을 추가 할
https://www.youtube.com/watch?v=RlfLCWKxHJ0