php 获取object_PHP反射机制实现自动依赖注入
生活随笔
收集整理的這篇文章主要介紹了
php 获取object_PHP反射机制实现自动依赖注入
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
依賴注入又叫控制反轉(zhuǎn),使用過框架的人應(yīng)該都不陌生。很多人一看名字就覺得是非常高大上的東西,就對它望而卻步,今天解開他它的神秘面紗。廢話不多說,直接上代碼;
/** * * 工具類,使用該類來實現(xiàn)自動依賴注入。 * */ class Ioc {// 獲得類的對象實例public static function getInstance($className) {$paramArr = self::getMethodParams($className);return (new ReflectionClass($className))->newInstanceArgs($paramArr);}/*** 執(zhí)行類的方法* @param [type] $className [類名]* @param [type] $methodName [方法名稱]* @param [type] $params [額外的參數(shù)]* @return [type] [description]*/public static function make($className, $methodName, $params = []) {// 獲取類的實例$instance = self::getInstance($className);// 獲取該方法所需要依賴注入的參數(shù)$paramArr = self::getMethodParams($className, $methodName);return $instance->{$methodName}(...array_merge($paramArr, $params));}/*** 獲得類的方法參數(shù),只獲得有類型的參數(shù)* @param [type] $className [description]* @param [type] $methodsName [description]* @return [type] [description]*/protected static function getMethodParams($className, $methodsName = '__construct') {// 通過反射獲得該類$class = new ReflectionClass($className);$paramArr = []; // 記錄參數(shù),和參數(shù)類型// 判斷該類是否有構(gòu)造函數(shù)if ($class->hasMethod($methodsName)) {// 獲得構(gòu)造函數(shù)$construct = $class->getMethod($methodsName);// 判斷構(gòu)造函數(shù)是否有參數(shù)$params = $construct->getParameters();if (count($params) > 0) {// 判斷參數(shù)類型foreach ($params as $key => $param) {if ($paramClass = $param->getClass()) {// 獲得參數(shù)類型名稱$paramClassName = $paramClass->getName();// 獲得參數(shù)類型$args = self::getMethodParams($paramClassName);$paramArr[] = (new ReflectionClass($paramClass->getName()))->newInstanceArgs($args);}}}}return $paramArr;} }上面的代碼使用php的反射函數(shù),創(chuàng)建了一個容器類,使用該類來實現(xiàn)其他類的依賴注入功能。上面的依賴注入分為兩種,一種是構(gòu)造函數(shù)的依賴注入,一種是方法的依賴注入。 我們使用下面三個類來做下測試。
class A {protected $cObj;/*** 用于測試多級依賴注入 B依賴A,A依賴C* @param C $c [description]*/public function __construct(C $c) {$this->cObj = $c;}public function aa() {echo 'this is A->test';}public function aac() {$this->cObj->cc();} }class B {protected $aObj;/*** 測試構(gòu)造函數(shù)依賴注入* @param A $a [使用引來注入A]*/public function __construct(A $a) {$this->aObj = $a;}/*** [測試方法調(diào)用依賴注入]* @param C $c [依賴注入C]* @param string $b [這個是自己手動填寫的參數(shù)]* @return [type] [description]*/public function bb(C $c, $b) {$c->cc();echo "rn";echo 'params:' . $b;}/*** 驗證依賴注入是否成功* @return [type] [description]*/public function bbb() {$this->aObj->aac();} }class C {public function cc() {echo 'this is C->cc';} }測試構(gòu)造函數(shù)的依賴注入:
// 使用Ioc來創(chuàng)建B類的實例,B的構(gòu)造函數(shù)依賴A類,A的構(gòu)造函數(shù)依賴C類。 $bObj = Ioc::getInstance('B'); $bObj->bbb(); // 輸出:this is C->cc , 說明依賴注入成功。// 打印$bObj var_dump($bObj);// 打印結(jié)果,可以看出B中有A實例,A中有C實例,說明依賴注入成功。 object(B)#3 (1) {["aObj":protected]=>object(A)#7 (1) {["cObj":protected]=>object(C)#10 (0) {}} }測試方法依賴注入:
Ioc::make('B', 'bb', ['this is param b']);// 輸出結(jié)果,可以看出依賴注入成功。 this is C->cc params:this is param b從上面兩個例子可以看出我們創(chuàng)建對象或者調(diào)用方法時,根本就不用知道該類或該方法依賴了那個類。使用反射機制可以輕松的為我們自動注入所需要的類。
總結(jié):
其實只要熟悉php的反射機制,依賴注入并不難實現(xiàn),上面的代碼為了方便理解,所以寫的簡單除暴,在實際的項目中肯定不會這么簡單,比如:會對注入的類和參數(shù)進行配置,比如會緩存實例化過的類,下次需要該類的實例時,可以直接使用,而不用在重新初始化等等。只要你原理了解了,其他的可以隨著項目的需求自己去完善。
以上內(nèi)容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業(yè)務(wù)代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構(gòu)、高可擴展、高性能、高并發(fā)、服務(wù)器性能調(diào)優(yōu)、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優(yōu)化、shell腳本、Docker、微服務(wù)、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要請戳這里鏈接 或 者關(guān)注咱們下面的知乎專欄PHP架構(gòu)師圈子?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的php 获取object_PHP反射机制实现自动依赖注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: query登录linux命令,在Linu
- 下一篇: php 解压rar文件怎么打开方式,ph