本文參考部落格( 非常感謝原博主.為了加深理解,做了部分修改,增加了適當注釋.
前一篇簡單理解了php依賴注入,在實際開發過程中,我們並不知道依賴的類將來會擴充套件成什麼樣子,因此我們需要在實現依賴注入的時候,通過容器利用php反射類去實現. 這裡的容器其實就是乙個能通過反射類實現依賴注入,並且最終返回我們需要的例項的類.
大致實現思路:
以下是示例**,
建立 test.php:
<?php
//設定三個有依賴關係的類: a依賴b,b依賴c
classc}
class
bpublic
function
test()
}class
apublic
function
test()
}
建立容器類container.php
<?php
class
container
public
function
__get
($name
)throw
newexception
($name
.'is not exist in the repository');
}/**
*建立類的例項,並注入依賴
*@param $name string 類名
*@return object 返回類的例項
*/public
function
build
($name
)//通過反射獲取類的內部結構,例項化類
$reflector
=new
reflectionclass
($name);
//檢查類是否可以例項化, 排除抽象類, 介面if(
!$reflector
->
isinstantiable()
)//獲取類的建構函式
$constructor
=$reflector
->
getconstructor()
;//若無建構函式,說明被依賴類中沒有再依賴其他類,直接返回例項化物件if(
is_null
($constructor))
//獲取構造函式引數,返回引數列表陣列
$parameters
=$constructor
->
getparameters()
;//遞迴解析引數,獲取依賴的引數或者依賴類的物件
$dependencies
=$this
->
getdependencies
($parameters);
//建立類的例項,將遞迴解析獲取的引數傳遞到建構函式
return
$reflector
->
newinstanceargs
($dependencies);
}/**
*獲取依賴的類
*@param $parameters array 建構函式的引數列表陣列
*@return array 返回由依賴類的例項和建構函式普通引數的預設值組成的陣列
*/public
function
getdependencies
($parameters
)else
}return
$dependencies;}
/** *獲取構造函式引數的預設值
*@param $parameter
*@return 返回構造函式引數預設的值
*/public
function
resolvenonclass
($parameter
)throw
newexception(''
);}}
在test.php中引入container類並使用依賴注入:
<?php..
.require_once
'./container.php'
;$container
=new
container
;$container
->a=
'a';$a=
$container
->a;
//建立a類的例項, 並自動注入依賴. $a-
>
test()
;// 輸出 c b a
反射實現加依賴注入
這裡定義乙個person類 class person 定義了乙個介面module inte ce module 定義ftpmodule類 class ftpmodule implements module function setuser user function execute class pe...
PHP基於反射機制實現自動依賴注入的方法詳解
依賴注入又叫控制反轉,使用過框架的人應該都不陌生。很多人一看名字就覺得是非常高大上的東西,就對它望而卻步,今天抽空研究了下,解開他它的神秘面紗。廢話不多說,直接上 工具類,使用該類來實現自動依賴注入。class ioc 執行類的方法 param type classname 類名 param typ...
php 依賴注入的實現
當a類需要依賴於b類,也就是說需要在a類中例項化b類的物件來使用時候,如果b類中的功能發生改變,也會導致a類中使用b類的地方也要跟著修改,導致a類與b類高耦合。這個時候解決方式是,a類應該去依賴b類的介面,把具體的類的例項化交給外部。為了約束我們先定義乙個訊息介面 inte ce message i...