最近在使用ThinkPHP5框架,看了下他的源碼,發現有很多地方也用到了依賴注入(控制反轉),覺得有必要和大家簡單聊一聊什麼是依賴注入以及怎麼使用它。
簡介
IoC - Inversion of Control 控制反轉
DI - Dependency Injection 依賴注入
依賴注入和控制反轉說的實際上是同一個東西,它們是一種設計模式,這種設計模式用來減少程序間的耦合
優勢(為什麼使用)使用依賴注入,最重要的一點好處就是有效的分離了對象和它所需要的外部資源,使得它們松散耦合,有利于功能複用,更重要的是使得程序的整個體系結構變得非常靈活。
概念依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。
對于一個菜鳥,如果你看了上面的概念還是一頭霧水的話,那麼恭喜你,你和我一樣不是天才,那麼下面就讓我們借助于幾個問答來搞清楚這個概念的意思吧。
問題
代碼示意:
<?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了,如下圖所示:
而是被動等待,等待IoC/DI的容器獲取一個C的實例,然後反向的注入到A類中,如下圖所示:
代碼示意:
<?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,而是所有面向對象的語言基本都是可以适用的。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!