>백엔드 개발 >PHP 문제 >PHP 의존성 주입이란 무엇입니까?

PHP 의존성 주입이란 무엇입니까?

王林
王林원래의
2019-09-23 13:14:183658검색

의존성 주입이 무엇인지 아시나요? DI(종속성 주입)의 개념이 심오해 보이지만 일부 최신 PHP 프레임워크를 사용해 본 적이 있다면 DI에 익숙해야 합니다. 왜냐하면 이 프레임워크는 모두 클래스 간 종속성을 처리하기 위해 종속성 주입을 사용하기 때문입니다.

PHP 의존성 주입이란 무엇입니까?

PHP에서 종속성을 전달하는 세 가지 옵션

사실 DI를 이해하려면 먼저 PHP에서 종속성을 전달하는 방법을 이해해야 합니다.

가장 바람직하지 않은 해결책이기도 한 첫 번째 해결책은 다음 코드와 같이 클래스 A의 new 키워드를 직접 사용하여 클래스 B를 생성하는 것입니다.

<?php
class A
{
  public function __construct()
  {
    $b = new B();
  }
}
#🎜 🎜# 이 솔루션이 바람직하지 않은 이유는 무엇입니까? 이 경우 A와 B가 함께 결합되므로 A 클래스는 B 클래스 없이 작동할 수 없습니다.

두 번째 옵션은 클래스 A의 메서드에 필수 클래스 B를 전달하는 것입니다.

다음 코드는 다음과 같습니다.

<?php
class A
{
  public function __construct(B $b)
  {
  }
}

이 방법은 첫 번째 솔루션보다 개선된 것입니다. 클래스 A는 클래스 B와 번들로 묶일 필요가 없습니다. 들어오는 클래스가 클래스 A의 요구 사항을 충족하는 한 클래스 C, 클래스 D일 수도 있습니다. 등등 잠깐만요. 그러나 이 솔루션의 단점은 클래스 A가 많은 클래스에 종속되는 경우 매개변수 목록이 매우 길어 혼동이 쉽게 발생할 수 있다는 것입니다.

세 번째 옵션은 다음 코드에 표시된 대로 set 메서드를 사용하여

을 전달하는 것입니다.

<?php
class A
{
  public function setB(B $b)
  {
    $this->b = $b;
  }
}
#🎜 🎜#이런 솔루션도 두 번째 솔루션과 동일한 단점이 있습니다. 종속 클래스 수가 증가하면 매우 많은 설정 메서드가 필요합니다. 이때 우리는 이러한 종속성을 관리하는 데 도움이 될 수 있는 특별한 클래스(또는 컨테이너)가 있으면 좋겠다고 생각했습니다.

종속성 주입의 간단한 예

다음 코드는 트위터에서 가져온 것입니다.

<?php
class Container {
 private $s=array();
 function __set($k, $c) { $this->s[$k]=$c; }
 function __get($k) { return $this->s[$k]($this); }
}

컨테이너를 만든 후 class A와 B 사이의 종속성을 어떻게 관리할 수 있습니까? 코드로 이야기해 보겠습니다.

<?php
class A
{
  private $container;
  public function __construct(Container $container)
  {
    $this->container = $container;
  }
  public function doSomeThing()
  {
    //do something which needs class B
    $b = $this->container->getB();
    //to do
  }
}

그런 다음 클래스 B를 컨테이너 클래스에 삽입합니다.

$c = new Container();
$c->setB(new B());

Enter를 전달할 수도 있습니다. 익명 함수를 사용하면 클래스 B가 전달될 때 즉시 인스턴스화되지 않지만 실제로 호출되면 인스턴스화 작업이 완료됩니다.

$c = new Container();
$c->setB(function (){
  return new B();
});
다음은 매우 간단한 예입니다. 예를 들어, 실제로 컨테이너 클래스에는 지연 로딩 등 고려해야 할 사항이 많습니다.

위 내용은 참고용입니다!

추천 튜토리얼:

PHP 비디오 튜토리얼

위 내용은 PHP 의존성 주입이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.