依賴注入
Dependency Injection 依賴注入
EasySwoole
實(shí)現(xiàn)了簡單版的 IOC 容器
,使用 IOC 容器
可以很方便地存儲(chǔ)/獲取資源,實(shí)現(xiàn)解耦。
使用依賴注入,最重要的一點(diǎn)好處就是有效地分離了對(duì)象和它所需要的外部資源,使得它們松散耦合,有利于功能復(fù)用,更重要的是使得程序的整個(gè)體系結(jié)構(gòu)變得非常靈活。
在我們的日常開發(fā)中,創(chuàng)建對(duì)象的操作隨處可見,以至于對(duì)其十分熟悉的同時(shí)又感覺十分繁瑣,每次需要對(duì)象都需要親手將其 new
出來,甚至某些情況下由于壞編程習(xí)慣還會(huì)造成對(duì)象無法被回收,這是相當(dāng)糟糕的。但更為嚴(yán)重的是,我們一直倡導(dǎo)的松耦合、少入侵原則,這種情況下變得一無是處。于是前輩們開始謀求改變這種編程陋習(xí),考慮如何使用編碼更加解耦合,由此而來的解決方案是面向接口的編程。
注意:在服務(wù)啟動(dòng)后,對(duì) IOC容器
的獲取/注入僅限當(dāng)前進(jìn)程有效。不對(duì)其他 worker
進(jìn)程產(chǎn)生影響。
方法列表
getInstance
用于獲取依賴注入組件 IoC 容器
對(duì)象。
使用示例:
$di = \EasySwoole\Component\Di::getInstance();
set
用于向 IoC 容器
中注入內(nèi)容。
函數(shù)原型:set($key, $obj, ...$arg): void
-
$key: 鍵名。
-
$obj: 要注入的內(nèi)容。支持注入對(duì)象名、對(duì)象實(shí)例、閉包、資源、字符串等各種常見變量。
-
$arg: 若注入的內(nèi)容為
is_callable
類型,則可以設(shè)置該參數(shù)以供callable
執(zhí)行時(shí)傳入。
使用示例:
$di->set('test', new TestClass());
$di->set('test', TestClass::class);
// set 的時(shí)候儲(chǔ)存的是[類名, 方法名]的數(shù)組,需要自己手動(dòng)調(diào)用 call_user_func() 執(zhí)行(不要被錯(cuò)誤與異常章節(jié)的 demo 誤解為會(huì)自動(dòng)執(zhí)行)
$di->set('test', [TestClass::class,'testFunction']);
// set 的時(shí)候傳遞了類名,get 的時(shí)候才去 new 對(duì)象,并且將可變變量傳遞進(jìn)構(gòu)造函數(shù),返回實(shí)例化后的對(duì)象
$di->set('test', TestClass::class, $arg_one, $arg_tow);
Di
的 set
方法為懶惰加載模式,若 set
一個(gè)對(duì)象名或者閉包,則該對(duì)象不會(huì)馬上被創(chuàng)建。
get
用戶獲取 IoC 容器
中某個(gè)注入的內(nèi)容。
函數(shù)原型:get($key)
- $key: 調(diào)用
set
方法時(shí)設(shè)置的鍵名。
使用示例:
$val = $di->get('test');
delete
用戶刪除 IoC 容器
中某個(gè)注入的內(nèi)容。
函數(shù)原型:delete($key): void
- $key: 調(diào)用
set
方法時(shí)設(shè)置的鍵名。
使用示例:
$di->delete('test');
clear
用于清空 IoC 容器
的所有內(nèi)容。
函數(shù)原型:clear($key): void
- $key: 調(diào)用
set
方法時(shí)設(shè)置的鍵名。