摘要:現(xiàn)在的框架中都有一個容器,而容器解決依賴的問題是通過反射來達到的,首先先說明一下項目文件結(jié)構(gòu)核心,獲得實例而我們要運行,而這個控制器的構(gòu)造函數(shù)需要一個類,而類構(gòu)造函數(shù)需要一個類。以上代碼可以查看我的倉庫
現(xiàn)在的框架中都有一個容器, 而容器解決依賴的問題是通過反射來達到的,
首先先說明一下項目文件結(jié)構(gòu):
/ ROOT_PATH ├─src │ ├─Controllers │ │ └─IndexController.php | ├─Application.php (核心,獲得實例) │ ├─Http.php │ └─Request.php │ ├─vendor │ └─autoload.php │ ├─composer.json └─index.php
而我們要運行IndexController.php,而這個控制器的構(gòu)造函數(shù)需要一個Request類,而Request類構(gòu)造函數(shù)需要一個Http類。
IndexController.php
className; } }
Application.php
isInstantiable()) { throw new Exception($class . " 類不可實例化"); } // 查看是否用構(gòu)造函數(shù) $rel_method = $rel_class->getConstructor(); // 沒有構(gòu)造函數(shù)的話,就可以直接 new 本類型了 if (is_null($rel_method)) { return new $class(); } // 有構(gòu)造函數(shù)的話就獲取構(gòu)造函數(shù)的參數(shù) $dependencies = $rel_method->getParameters(); // 處理,把傳入的索引數(shù)組變成關(guān)聯(lián)數(shù)組, 鍵為函數(shù)參數(shù)的名字 foreach ($parameters as $key => $value) { if (is_numeric($key)) { // 刪除索引數(shù)組, 只留下關(guān)聯(lián)數(shù)組 unset($parameters[$key]); // 用參數(shù)的名字做為鍵 $parameters[$dependencies[$key]->name] = $value; } } // 處理依賴關(guān)系 $actual_parameters = []; foreach ($dependencies as $dependenci) { // 獲取對象名字,如果不是對象返回 null $class_name = $dependenci->getClass(); // 獲取變量的名字 $var_name = $dependenci->getName(); // 如果是對象, 則遞歸new if (array_key_exists($var_name, $parameters)) { $actual_parameters[] = $parameters[$var_name]; } elseif (is_null($class_name)) { // null 則不是對象,看有沒有默認值, 如果沒有就要拋出異常 if (! $dependenci->isDefaultValueAvailable()) { throw new Exception($var_name . " 參數(shù)沒有默認值"); } $actual_parameters[] = $dependenci->getDefaultValue(); } else { $actual_parameters[] = self::make($class_name->getName()); } } // 獲得構(gòu)造函數(shù)的數(shù)組之后就可以實例化了 return $rel_class->newInstanceArgs($actual_parameters); } }
Http.php
className = __CLASS__; } }
Request.php
className = __CLASS__; $this->className = $this->className . " -> " . $http->className; } }
index.php
輸出:
我是 WaitmoonmanReflexControllersIndexController 我依賴WaitmoonmanReflexRequest -> WaitmoonmanReflexHttp F:phpStudyWWW eflexindex.php:12: object(WaitmoonmanReflexControllersIndexController)[9]這就是一個完整的反射類動態(tài)注入?yún)?shù)的實例。
以上代碼可以查看我的git倉庫
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/25851.html
摘要:也正式因為類的反射很多框架才能實現(xiàn)依賴注入自動解決類與類之間的依賴關(guān)系,這給我們平時的開發(fā)帶來了很大的方便。為了更好地理解,我們通過一個例子來看類的反射,以及如何實現(xiàn)依賴注入。反射出方法的參數(shù)其返回值為對象構(gòu)成的數(shù)組。 PHP具有完整的反射 API,提供了對類、接口、函數(shù)、方法和擴展進行逆向工程的能力。通過類的反射提供的能力我們能夠知道類是如何被定義的,它有什么屬性、什么方法、方法都有...
摘要:依賴注入控制反轉(zhuǎn)的一種具體實現(xiàn)方法。接下來,我們使用依賴注入實現(xiàn)控制反轉(zhuǎn),使依賴關(guān)系倒置依賴被動傳入。從單元測試的角度看,依賴注入更方便和操作,方便了測試人員寫出質(zhì)量更高的測試代碼。 前言 好的設(shè)計會提高程序的可復(fù)用性和可維護性,也間接的提高了開發(fā)人員的生產(chǎn)力。今天,我們就來說一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...
摘要:反射在每個面向?qū)ο蟮木幊陶Z言中都存在,它的主要目的就是在運行時分析類或者對象的狀態(tài),導(dǎo)出或提取出關(guān)于類方法屬性參數(shù)等的詳細信息,包括注釋。反射是操縱面向?qū)ο蠓缎椭性P偷模捎糜跇?gòu)建復(fù)雜,可擴展的應(yīng)用。 反射在每個面向?qū)ο蟮木幊陶Z言中都存在,它的主要目的就是在運行時分析類或者對象的狀態(tài),導(dǎo)出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細信息,包括注釋。 反射是操縱面向?qū)ο蠓缎椭性P偷?AP...
摘要:框架中就是使用服務(wù)容器來實現(xiàn)控制反轉(zhuǎn)和依賴注入。容器依賴注入的實現(xiàn)實現(xiàn)原理需要了解的知識點閉包匿名函數(shù)匿名函數(shù),也叫閉包函數(shù),允許臨時創(chuàng)建一個沒有指定名稱的函數(shù)反射以上版本具有完整的反射,添加了對類接口函數(shù)方法和擴展進行反向工程的能力。 前言 通過實現(xiàn)laravel 框架功能,以便深入理解laravel框架的先進思想。 什么是服務(wù)容器 服務(wù)容器是用來管理類依賴與運行依賴注入的工具。La...
閱讀 2950·2021-11-23 09:51
閱讀 3776·2021-11-22 15:29
閱讀 3226·2021-10-08 10:05
閱讀 1552·2021-09-22 15:20
閱讀 952·2019-08-30 15:56
閱讀 1069·2019-08-30 15:54
閱讀 733·2019-08-26 11:54
閱讀 2636·2019-08-26 11:32