>  기사  >  백엔드 개발  >  PHP: 종속성 주입, 제어 반전, 종속성 반전 원칙

PHP: 종속성 주입, 제어 반전, 종속성 반전 원칙

不言
不言원래의
2018-04-20 11:53:181898검색

이 기사의 내용은 PHP에 관한 것입니다: 종속성 주입, 제어 반전, 종속성 반전 원리. 이제 특정 참조 가치가 있습니다. 필요한 친구가 참조할 수 있습니다.

코드 품질을 판단하려면 , 우리는 높은 응집력, 낮은 결합도라는 자체 표준을 가지고 있습니다. 이 문제를 해결하기 위해 PHP에는 팩토리 패턴, 싱글턴 패턴 등 우수한 디자인 패턴이 많이 있습니다.

코드에 반영된 디자인 패턴은 의존성 주입, 제어 역전과 같습니다.

<br>

그럼 의존성 주입이란 무엇일까요?

간단히 말하면 클래스 A가 의존하는 클래스 B, C 등을 클래스 A에서 직접 인스턴스화하는 것이 아니라 속성이나 생성자를 통해 클래스 A에 주입하는 것을 의미합니다.

일반적으로 코드를 작성할 때 이렇게 작성합니다

<br>

class EmailSendByQq {    
public function send(){    
}
}
class User(){
    public function register(){       
     $email = new EmailSendByQq();       
      $email->send();    
      }
      }

User 클래스의 등록 등록 메소드를 호출하고 Email 클래스를 인스턴스화하여 이메일을 보냅니다. User 클래스가 EmailSendByQq 클래스에 종속되어 있는 것을 볼 수 있습니다. 그러나 User 클래스는 이메일을 보낼 수 없습니다. 그러나 QQ 사서함을 사용하지 않고 대신 163(EmailSendBy163)을 사용하려면 EmailSendByQq의 인스턴스화를 수정해야 합니다. 각 클래스에서 컨트롤을 사용한다면 이 두 클래스의 분리를 반대로 하는 것이 더 나을 것입니다

<br>

<br>
class User {    
private $_emailSendObject;    
public function __construct($emailSendObject)
    {
            $this->_emailSendObject = $emailSendObject;    
    }       
 public function register(){        
 $this->_emailSendObject->send();    
 }}
 $emailSendObject = new EmailSendByQq;$user = new User($emailSendObject);$user->register();
 //以属性的方式同样也可以实现
 class EmailSendBy163 {    
 public function send(){    
 }
 }
 class User{    
 public $emailSendObject;    
 public function register(){       
  $this->emailSendObject->send();    
  }
  }
  $user = new User;$user->emailSendObject = new EmailSendBy163();$user->register();

<br>

위에서 생성자와 속성을 통해 객체를 전달하는 프로세스는 종속성 주입의 구현입니다.

“注入”就是把一个实例传到另一个实例内部。 接下来继续把上面的代码优化,简单工厂模式的体现。

//通过EmailSendByQq和EmailSendBy163类,我们提炼出一个interface接口,让User类register方法依赖于interface接口的对象看起来更合适interface EmailSender{    public function send();}class EmailSendByQq implements EmailSender{    public function send(){    }}class EmailSendBy163 implements EmailSender{    public function send()    {        // TODO: Implement send() method.    }}class User{    public $emailSenderClass;    public function __construct(EmailSender $emailSenderObject)    {        $this->emailSenderClass = $emailSenderObject;    }    public function register(){        $this->emailSenderClass->send();    }}$user = new User(new EmailSendBy163);$user->register();

이것은 디커플링을 달성합니다.

DIP(종속 반전 원칙)는 소프트웨어 설계 아이디어입니다. 전통적인 소프트웨어 설계에서는 상위 계층 코드가 하위 계층 코드에 따라 달라지므로 상위 계층 코드도 그에 따라 변경되어야 하므로 유지 관리 비용이 많이 듭니다. DIP의 핵심 아이디어는 상위 계층이 인터페이스를 정의하고 하위 계층이 이 인터페이스를 구현함으로써 하위 계층이 상위 계층에 종속되도록 하여 결합을 줄이고 전체 시스템의 유연성을 향상시키는 것입니다. 이는 효과가 입증된 전략입니다. <br>

관련 추천:

php 주입 지점 구성 코드 예시 상세 설명

<br>

위 내용은 PHP: 종속성 주입, 제어 반전, 종속성 반전 원칙의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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