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