日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 获取object_PHP反射机制实现自动依赖注入

發(fā)布時間:2025/3/15 php 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。