關(guān)鍵技術(shù)
-
ReflectionClass
反射類 - 遞歸
功能實(shí)現(xiàn)
一個(gè)簡單的自動(dòng)對(duì)象創(chuàng)建容器(暫不考慮相互依賴的類創(chuàng)建)
代碼實(shí)現(xiàn)
public function create($abstract)
{
$refClass = new ReflectionClass($abstract);
if ($refClass->hasMethod('__construct')) {
$methodParams = $refClass->getMethod('__construct')->getParameters();
foreach ($methodParams as $param) {
$_constructParams[] = $this->create($param->getClass()->getName());
}
}
return $refClass->newInstance(... ($_constructParams ?? []));
}
實(shí)現(xiàn)思路
- 類創(chuàng)建過程需要調(diào)用到構(gòu)造函數(shù)
__construct
,因此創(chuàng)建過程需要?jiǎng)討B(tài)獲取到__construct
的參數(shù)列表,列一下可行的方案-
ReflectionClass
反射類獲取 -
file_get_contents
或者readfile
讀取文件內(nèi)容匹配construct
參數(shù)部分 - 自定義數(shù)組存儲(chǔ)參數(shù)(即自己管理創(chuàng)建參數(shù) - 可通過腳本生成)
-
- 從上面看,顯然使用
ReflectionClass
反射類獲取__construct
是最方便的,也是目前幾乎所有PHP容器實(shí)現(xiàn)的選擇 - 然后考慮到
__construct
類中的其它類還有下一級(jí)的依賴參數(shù)列表,依賴層級(jí)是未知国裳,故需要使用遞歸去遍歷所有依賴(這里暫不考慮相互依賴的問題,后面會(huì)解決)
注
- 這僅僅是一個(gè)簡單的對(duì)象創(chuàng)建容器北苟,顯然這樣一個(gè)容器功能是很有限的,而且不能處理大部分問題惨寿。
- 本示例僅僅展示了容器的自動(dòng)注入功能是如何通過代碼實(shí)現(xiàn)的檬某,對(duì)象的自動(dòng)依賴注入創(chuàng)建并沒有想象的復(fù)雜安寺。
示例
- 你可以通過運(yùn)行 src\Example1\test_example_1.php 測試文件看到容器成功創(chuàng)建了對(duì)象
A
并自動(dòng)創(chuàng)建并注入了對(duì)象B
- 當(dāng)然弄慰,在嘗試創(chuàng)建對(duì)象
D
和E
時(shí)第美,代碼拋出了致命錯(cuò)誤,因?yàn)槿萜鞑⒉荒芙馕龌緮?shù)據(jù)類型以及mixed
類型的變量陆爽,這個(gè)問題將在下一節(jié)解決