相關(guān)關(guān)鍵詞
關(guān)于我們
最新文章
- PHP中opcode緩存簡(jiǎn)單用法分析
- thinkPHP控制器變量在模板中的顯示方法示例
- PHP move_uploaded_file() 函數(shù)(將上傳的文件移動(dòng)到新位置)
- dirname(__FILE__)的含義和應(yīng)用說(shuō)明
- thinkPHP5框架實(shí)現(xiàn)分頁(yè)查詢功能的方法示例
- PHP中單雙號(hào)與變量
- PHP獲得當(dāng)日零點(diǎn)時(shí)間戳的方法分析
- Laravel ORM對(duì)Model::find方法進(jìn)行緩存示例詳解
- PHP讀寫文件高并發(fā)處理操作實(shí)例詳解
- 【CLI】利用Curl下載文件實(shí)時(shí)進(jìn)度條顯示的實(shí)現(xiàn)
PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴注入的方法詳解
本文實(shí)例講述了PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴注入的方法。分享給大家供大家參考,具體如下:
依賴注入又叫控制反轉(zhuǎn),使用過(guò)框架的人應(yīng)該都不陌生。很多人一看名字就覺(jué)得是非常高大上的東西,就對(duì)它望而卻步,今天抽空研究了下,解開(kāi)他它的神秘面紗。廢話不多說(shuō),直接上代碼;
/** * * 工具類,使用該類來(lái)實(shí)現(xiàn)自動(dòng)依賴注入。 * */ class Ioc { // 獲得類的對(duì)象實(shí)例 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 = []) { // 獲取類的實(shí)例 $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') { // 通過(guò)反射獲得該類 $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; } }