의존성 주입이 무엇인지 아시나요? 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); } }
컨테이너를 만든 후 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!