>백엔드 개발 >PHP 문제 >PHP의 의존성 주입 원리

PHP의 의존성 주입 원리

藏色散人
藏色散人원래의
2019-11-01 09:18:126233검색

PHP의 의존성 주입 원리

PHP 종속성 주입의 원리

이 문서의 예제에서는 PHP 종속성 주입의 원리와 사용법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

소개

의존성 주입이 무엇인지 아시나요?

DI(종속성 주입)의 개념이 심오해 보이지만 일부 새로운 PHP 프레임워크를 사용해 본 적이 있다면 DI에 익숙해야 합니다. 왜냐하면 모두 종속성 주입을 사용하여 클래스 종속성을 처리하기 때문입니다.

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); }
}

컨테이너 클래스를 사용하여 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());

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

$c = new Container();
$c->setB(function (){
  return new B();
});

다음은 다음과 같습니다. example은 아주 간단한 예일 뿐입니다. 실제로 컨테이너 클래스에는 지연 로딩 등 고려해야 할 사항이 많습니다.

PHP 관련 지식을 더 알고 싶으시면 PHP 중국어 웹사이트를 방문하세요!

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

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