控制反轉原則,它和依賴注入有什麼聯繫
控制反轉(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(); }
小黃也需要去上班,現在他只安裝框架的指導就可以完成上班的動作了。
$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來記錄日子,而改用文字檔案的話,那麼就需要修改run裡面的程式碼。
現在,我們換成使用依賴注入這個技巧來改寫,程式碼如下;
class App { private $logHandle = null; public function __construct(Log $log) { $this->logHandle = $log; } public function run () { // do something // 记录日志 $this->logHandle->write('框架运行信息记录'); } }
#改寫後的App類別不再依賴RedisLog類,可以隨時換成其他的Log類,只要該類別實作了write方法即可。可以看到,使用了依賴注入,可以靈活的替換掉所依賴的類,另外它是編寫可測試程式碼最有效的手段。
知乎裡有一篇將依賴注入的文章,寫的非常通俗易懂,大家也可以去看看。連結如下:
淺聊控制反轉與依賴注入 https://zhuanlan.zhihu.com/p/33492169
以上是控制反轉原則,它和依賴注入有什麼聯繫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

這篇文章帶大家了解一下依賴注入,介紹一下依賴注入解決的問題和它原生的寫法是什麼,並聊聊Angular的依賴注入框架,希望對大家有所幫助!

在Phalcon框架中使用依賴注入(DependencyInjection)的方法引言:在現代的軟體開發中,依賴注入(DependencyInjection)是一種常見的設計模式,旨在提高程式碼的可維護性和可測試性。而Phalcon框架作為一個快速、低耗的PHP框架,也支援使用依賴注入來管理和組織應用程式的依賴關係。本文將向您介紹如何在Phalcon框架中

針對使用JUnit測試依賴注入,摘要如下:使用模擬物件建立依賴項:@Mock註解可建立依賴項的模擬物件。設定測試資料:@Before方法在每個測試方法前執行,用於設定測試資料。配置模擬行為:Mockito.when()方法配置模擬物件的預期行為。驗證結果:assertEquals()斷言檢查實際結果與預期值是否相符。實際應用:可使用依賴注入框架(如SpringFramework)注入依賴項,透過JUnit單元測試驗證注入的正確性和程式碼的正常運作。

控制反轉(IoC)是軟體設計模式,將物件依賴關係分離為硬編碼耦合。在Go中,可以透過介面和依賴注入(DI)實現IoC:介面:定義方法集,遵循該介面的類型必須實作這些方法。依賴注入:外部配置或程式碼產生設定物件依賴關係。技巧包括:建構函式註入:在建構函式中指定依賴關係。欄位注入:使用反射或程式碼產生向欄位注入依賴關係。介面注入:將介面類型作為參數傳遞給函數或方法。

在Go中,依賴注入(DI)模式透過函數參數傳遞實現,類型包括值傳遞和指標傳遞。在DI模式中,依賴項通常以指標傳遞,以提高解耦性、減少鎖爭用和支援可測試性。透過使用指針,函數與特定實作解耦,因為它只依賴介面類型。指標傳遞還可以減少傳遞大物件的開銷,從而減少鎖爭用。此外,DI模式可以輕鬆地為使用DI模式的函數編寫單元測試,因為可以輕鬆地模擬依賴項。

答案:在Go語言中,依賴注入可以透過介面和結構體來實現。定義一個描述依賴項行為的介面。建立一個實作該介面的結構體。在函數中透過介面作為參數注入依賴項。允許在測試或不同場景中輕鬆替換依賴項。

在PHP中使用依賴注入(DI)的核心價值在於實現松耦合的系統架構。 DI通過外部提供依賴的方式減少類之間的直接依賴關係,提高代碼的可測試性和靈活性。使用DI時,可以通過構造函數、設值方法或接口注入依賴,並結合IoC容器管理對像生命週期和依賴關係。

在Golang單元測試中使用依賴注入(DI)可以隔離要測試的程式碼,簡化測試設定和維護。流行的DI庫包括wire和go-inject,它們可以產生依賴項樁或模擬,供測試使用。 DI測試的步驟包括設定依賴項、設定測試案例和斷言結果。使用DI測試HTTP請求處理函數的範例表明,它可以輕鬆隔離和測試程式碼,無需實際依賴項或通訊。
