首页
/
每日頭條
/
生活
/
php技術分析教程
php技術分析教程
更新时间:2025-03-28 13:49:43
前言

最近在使用ThinkPHP5框架,看了下他的源碼,發現有很多地方也用到了依賴注入(控制反轉),覺得有必要和大家簡單聊一聊什麼是依賴注入以及怎麼使用它。

簡介

IoC - Inversion of Control 控制反轉 DI - Dependency Injection 依賴注入

依賴注入和控制反轉說的實際上是同一個東西,它們是一種設計模式,這種設計模式用來減少程序間的耦合

優勢(為什麼使用)

使用依賴注入,最重要的一點好處就是有效的分離了對象和它所需要的外部資源,使得它們松散耦合,有利于功能複用,更重要的是使得程序的整個體系結構變得非常靈活。

概念

依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。

  • 依賴注入是從應用程序的角度在描述,可以把依賴注入,即:應用程序依賴容器創建并注入它所需要的外部資源;
  • 而控制反轉是從容器的角度在描述,即:容器控制應用程序,由容器反向的向應用程序注入應用程序所需要的外部資源。
問答

對于一個菜鳥,如果你看了上面的概念還是一頭霧水的話,那麼恭喜你,你和我一樣不是天才,那麼下面就讓我們借助于幾個問答來搞清楚這個概念的意思吧。

問題
  1. 整個過程中參與者都有誰?
  2. 依賴:誰依賴于誰?為什麼需要依賴?
  3. 注入:誰注入于誰?到底注入了什麼?
  4. 控制反轉:誰控制誰?控制什麼?為何叫反轉(有反轉就應該有正轉了,正轉是什麼呢?)
  5. 依賴注入和控制反轉是同一概念嗎?
回答
  1. 整個過程中參與者都有誰? 一般有三方參與者,一個是某個對象;一個是IoC/DI的容器;另一個是某個對象的外部資源。 某個對象指的就是任意的、普通的PHP對象; IoC/DI的容器簡單點說就是指用來實現IoC/DI功能的一個框架程序; 對象的外部資源指的就是對象需要的,但是是從對象外部獲取的,都統稱資源,比如:對象需要的其它對象、或者是對象需要的文件資源等等。
  2. 誰依賴于誰: 當然是某個對象依賴于IoC/DI的容器
  3. 為什麼需要依賴: 對象需要IoC/DI的容器來提供對象需要的外部資源
  4. 誰注入于誰: 是IoC/DI的容器 注入 某個對象
  5. 到底注入什麼: 就是注入某個對象所需要的外部資源
  6. 誰控制誰: 當然是IoC/DI的容器來控制對象了
  7. 控制什麼: 主要是控制對象實例的創建
  8. 為何叫反轉: 反轉是相對于正向而言的,那麼什麼算是正向的呢? 考慮一下常規情況下的應用程序,如果要在A裡面使用C,你會怎麼做呢?當然是直接去創建C的對象,也就是說,是在A類中主動去獲取所需要的外部資源C($c = new C();),這種情況被稱為正向的。那麼什麼是反向呢?就是A類不再主動去獲取C,而是被動等待,等待IoC/DI的容器獲取一個C的實例,然後反向的注入到A類中。 用圖例來說明一下,先看沒有IoC/DI的時候,常規的A類使用C類的示意圖,如下圖所示:

php技術分析教程(聊一聊PHP的依賴注入)1

代碼示意:

<?php /** * 沒有IoC/DI的時候,常規的A類使用C類的示例 */ /** * Class c */ class c { public function say() { echo 'hello'; } } /** * Class a */ class a { private $c; public function __construct() { $this->c = new C(); // 實例化創建C類 } public function sayC() { echo $this->c->say(); // 調用C類中的方法 } } $a = new a(); $a->sayC();

當有了IoC/DI的容器後,A類不再主動去創建C了,如下圖所示:

php技術分析教程(聊一聊PHP的依賴注入)2

而是被動等待,等待IoC/DI的容器獲取一個C的實例,然後反向的注入到A類中,如下圖所示:

php技術分析教程(聊一聊PHP的依賴注入)3

代碼示意:

<?php /** * 當有了IoC/DI的容器後,a類依賴c實例注入的示例 */ /** * Class c */ class c { public function say() { echo 'hello'; } } /** * Class a */ class a { private $c; public function setC(C $c) { $this->c = $c; // 實例化創建C類 } public function sayC() { echo $this->c->say(); // 調用C類中的方法 } } $c = new C(); $a = new a(); $a->setC($c); $a->sayC();

9.什麼是正轉?正轉就是按照普通的我們再類中直接創建對象實例,如 $c = new C();

10.依賴注入和控制反轉是同一概念嗎?

根據上面的講述,我們不難出來,`依賴注入`和`控制反轉`确實是對同一件事情的不同描述,從某個方面講,就是它們描述的`角度`不同。

總結

其實IoC/DI對編程帶來的最大改變不是從代碼上,而是從思想上,發生了“主從換位”的變化。應用程序原本是老大,要獲取什麼資源都是主動出擊,但是在IoC/DI思想中,應用程序就變成被動的了,被動的等待IoC/DI容器來創建并注入它所需要的資源了。

注意

我們上面說了,這是一種“設計模式”,就像“工廠模式”和“單例模式”等是一樣的,它是一種面向對象中的編程“思想”,自然它也不僅限于PHP,而是所有面向對象的語言基本都是可以适用的。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
如何挑選無葉風扇這樣挑選健康又安全
如何挑選無葉風扇這樣挑選健康又安全
第一、查看無葉風扇的外觀在我們外行看來,無葉風扇其實一個樣,除了顔色不同之外,不就是一個個圓圈嘛。那麼在選擇的時候,也就看看能不通電就買回家了,這樣的選購方式是錯誤的哦,首先你得查看一下無葉風扇的外觀,看看無葉風扇表面是不是後來噴上的油漆,質量好的無葉風扇表面的物質是注塑出來的,那種後來噴上無葉風扇...
2025-03-28
暖氣片的接法有幾種
暖氣片的接法有幾種
1、單管串聯方式:單管串聯的特點是材料使用量低、勞動強度相對較弱、改造時間也短些。整個系統的水先經過系統的第一組暖氣片,而後是第二組,第三組……,因此水溫是按照串聯的順序逐漸降低。2、雙管異程并聯:雙管異程并聯的特點是管道行程較短、每一組散熱器均可以單獨控制散熱器前端進回水處加控制閥門)、溫度比較均...
2025-03-28
黃瓜減肥方法食譜有哪些
黃瓜減肥方法食譜有哪些
大家應該都清楚黃瓜的水分超強的多,在飯桌上是經常見到的,不僅能達到美容護膚的功效,還會有減肥的作用,今天網小編就來分享黃瓜減肥的食譜,幫助大家恢複苗條的身材。山楂汁拌黃瓜先準備好黃瓜去皮洗幹淨,頭和尾部都去掉,切成細小的條狀,然後将山楂洗幹淨,用水煮上15~20分鐘,留下裡面的汁液方便後面用,黃瓜條...
2025-03-28
衣服上凝固的美縫劑怎麼去掉
衣服上凝固的美縫劑怎麼去掉
1、清潔劑或鹽酸:先把衣服放在水裡浸泡半小時,然後用清潔劑或鹽酸(家用鹽)耐心清洗衣服上殘留的美縫劑。2、洗發水:用洗發水浸透污處,再加點白醋加水稀釋,然後用刷子擦洗。3、酒精:使用酒精清洗,酒精具有很強的溶解性,能溶解大多數有機物從而揮發。美縫劑:美縫劑是勾縫劑的升級産品,美縫劑的裝飾性實用性明顯...
2025-03-28
夏天穿闊腿褲怎麼搭配
夏天穿闊腿褲怎麼搭配
1、黑色短背心+闊腿拖地老爹褲。夏天穿闊腿褲,一件好看又百搭的吊帶背心真的是必入的單品啦,黑色吊帶背心搭配這條泫雅風淺色的闊腿拖地老爹褲,真的是翻倍美呀,不僅時髦清涼,還讓絕世美腿在視覺上再拉長了n厘米,這個夏天,闊腿褲遇上了吊帶背心真的是真愛呀。2、娃娃抽繩襯衫+黑色高腰闊腿褲。夏天穿闊腿褲,簡單...
2025-03-28
Copyright 2023-2025 - www.tftnews.com All Rights Reserved