>  기사  >  백엔드 개발  >  제어 원리의 반전, 종속성 주입과의 연관성은 무엇입니까?

제어 원리의 반전, 종속성 주입과의 연관성은 무엇입니까?

齐天大圣
齐天大圣원래의
2020-08-12 10:47:281582검색

제어 반전(IOC)

먼저 예시를 살펴보겠습니다.

class Person
{
   private $name = '';
   private $age = 0;

   public function __construct(string $name, int $age)
   {
       $this->name = $name;
       $this->age = $age;
   }

   public function eat ()
   {
       echo '吃东西' . PHP_EOL;
   }

   public function drink ()
   {
       echo '喝水' . PHP_EOL;
   }

   public function sleep ()
   {
       echo '睡觉' . PHP_EOL;
   }

   public function wakeup ()
   {
       echo '起床' . PHP_EOL;
   }

   public function drive ()
   {
       echo '开车' . PHP_EOL;
   }

   public function wash ()
   {
       echo '洗漱' . PHP_EOL;
   }
}

샤오밍은 이제 아침에 일어나 출근해야 하기 때문에 다음과 같은 일을 해야 합니다.

$person = new Person('小明', 24);
$person->wakeup();
$person->wash();
$person->eat();
echo '带上车钥匙、手机、电脑' .PHP_EOL;
$person->drive();

위 프로세스는 모두 프로그래머가 직접 제어합니다. 이제 프레임워크가 프로세스를 제어하도록 하는 방법을 찾아보겠습니다. Person 클래스에 새 메소드를 추가합니다. 코드는 다음과 같습니다.

public function work (callable $bring)
{
    $this->wakeup();
    $this->wash();
    $this->eat();
    $bring();
    $this->drive();
}

Xiao Huang도 출근해야 하며 이제 출근 작업을 완료하려면 프레임워크의 지침만 설치하면 됩니다.

$person = new Person('小黄', 29);
$person->work(function ()
{
    echo '带上手机、车钥匙、文件' . PHP_EOL;
});

수정된 코드는 제어 반전을 완료했습니다. 이전 코드에서는 전체 작업 프로세스를 프로그래머가 제어했지만, 수정된 코드에서는 프레임워크가 작업 프로세스를 제어합니다. 프로그램의 흐름 제어는 프로그래머에서 프레임워크로 "역전"됩니다.

이제 제어 역전의 정의를 내릴 수 있습니다.

사실 제어 역전은 특정 구현 방법이 아닌 비교적 일반적인 설계 아이디어이며 일반적으로 프레임워크 수준의 설계를 안내하는 데 사용됩니다. 여기서 말하는 "제어"는 프로그램 실행 흐름을 제어하는 ​​것을 의미하고, "역전"은 프레임워크를 사용하기 전에 프로그래머가 전체 프로그램의 실행을 제어하는 ​​것을 의미합니다. 프레임워크를 사용한 후 전체 프로그램의 실행 흐름은 프레임워크를 통해 제어됩니다. 프로세스 제어는 프로그래머에서 프레임워크로 "역전"됩니다.

종속성 주입

제어 반전은 설계 아이디어인 반면, 종속성 주입은 제어 반전을 구현하는 데 가장 일반적으로 사용되는 기술입니다. 종속성 주입은 "고급"처럼 보이지만 실제로는 이해하고 익히기가 매우 쉽습니다.

그럼 종속성 주입이란 정확히 무엇인가요? 한 문장으로 요약하면, new()를 통해 클래스 내부에 종속 클래스 객체를 생성하는 대신, 외부에서 종속 클래스 객체를 생성한 후 생성자, 함수 매개변수 등을 통해 전달(또는 주입)합니다. .

예를 살펴보겠습니다.

interface Log
{
   function write (string $msg);
}

class TextLog implements Log
{
   public function __construct($dirname, $txtname)
   {
       $this->makeDir($dirname);
       $this->mkTxt($txtname);
   }

   private function makeDir (string $dirName) :void
   {
       // do something
   }

   private function mkTxt (string $txtName) :void
   {
       // do something
   }

   public function write (string $msg)
   {
       // do something
   }
}

class RedisLog implements Log
{
   private $redis = null;
   private $key = '';

   public function __construct(string $key)
   {
       $this->redis = '...'; // 获取redis实例
       $this->key = $key;
       // ...
   }

   public function write (string $msg)
   {
       // do something
   }
}

class App
{
   public function run ()
   {
       // do something

       // 记录日志
       (new RedisLog('log'))->write('框架运行信息记录');
   }
}

보시다시피 App 클래스는 RedisLog 클래스에 따라 달라집니다. 앞으로의 날짜를 기록하기 위해 더 이상 redis를 사용하지 않고 대신 텍스트 파일을 사용한다면 실행중인 코드.

이제 종속성 주입 기술을 사용하여 다시 작성하는 것으로 전환합니다. 코드는 다음과 같습니다.

class App
{
   private $logHandle = null;

   public function __construct(Log $log)
   {
       $this->logHandle = $log;
   }

   public function run ()
   {
       // do something

       // 记录日志
       $this->logHandle->write('框架运行信息记录');
   }
}

다시 작성된 App 클래스는 더 이상 RedisLog 클래스에 의존하지 않으며 언제든지 다른 Log 클래스로 대체될 수 있습니다. 클래스는 쓰기 메소드를 구현합니다. 보시다시피 종속성 주입은 종속 클래스를 유연하게 대체할 수 있으며 테스트 가능한 코드를 작성하는 가장 효과적인 방법입니다.

Zhihu에 의존성 주입에 관한 기사가 있으니 읽어보시면 아주 쉽습니다. 링크는 다음과 같습니다.

제어 반전 및 종속성 주입에 대한 간략한 설명 https://zhuanlan.zhihu.com/p/33492169

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

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