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 중국어 웹사이트의 기타 관련 기사를 참조하세요!