PHP利用反射實現依賴注入

2021-10-04 04:28:47 字數 2376 閱讀 8331

本文參考部落格( 非常感謝原博主.為了加深理解,做了部分修改,增加了適當注釋.

前一篇簡單理解了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...