摘要:現(xiàn)在的框架中都有一個容器,而容器解決依賴的問題是通過反射來達(dá)到的,首先先說明一下項(xiàng)目文件結(jié)構(gòu)核心,獲得實(shí)例而我們要運(yùn)行,而這個控制器的構(gòu)造函數(shù)需要一個類,而類構(gòu)造函數(shù)需要一個類。以上代碼可以查看我的倉庫
現(xiàn)在的框架中都有一個容器, 而容器解決依賴的問題是通過反射來達(dá)到的,
首先先說明一下項(xiàng)目文件結(jié)構(gòu):
/ ROOT_PATH ├─src │ ├─Controllers │ │ └─IndexController.php | ├─Application.php (核心,獲得實(shí)例) │ ├─Http.php │ └─Request.php │ ├─vendor │ └─autoload.php │ ├─composer.json └─index.php
而我們要運(yùn)行IndexController.php,而這個控制器的構(gòu)造函數(shù)需要一個Request類,而Request類構(gòu)造函數(shù)需要一個Http類。
IndexController.php
className; } }
Application.php
isInstantiable()) { throw new Exception($class . " 類不可實(shí)例化"); } // 查看是否用構(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 則不是對象,看有沒有默認(rèn)值, 如果沒有就要拋出異常 if (! $dependenci->isDefaultValueAvailable()) { throw new Exception($var_name . " 參數(shù)沒有默認(rèn)值"); } $actual_parameters[] = $dependenci->getDefaultValue(); } else { $actual_parameters[] = self::make($class_name->getName()); } } // 獲得構(gòu)造函數(shù)的數(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ù)的實(shí)例。
以上代碼可以查看我的git倉庫
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/25851.html
摘要:也正式因?yàn)轭惖姆瓷浜芏嗫蚣懿拍軐?shí)現(xiàn)依賴注入自動解決類與類之間的依賴關(guān)系,這給我們平時的開發(fā)帶來了很大的方便。為了更好地理解,我們通過一個例子來看類的反射,以及如何實(shí)現(xiàn)依賴注入。反射出方法的參數(shù)其返回值為對象構(gòu)成的數(shù)組。 PHP具有完整的反射 API,提供了對類、接口、函數(shù)、方法和擴(kuò)展進(jìn)行逆向工程的能力。通過類的反射提供的能力我們能夠知道類是如何被定義的,它有什么屬性、什么方法、方法都有...
摘要:依賴注入控制反轉(zhuǎn)的一種具體實(shí)現(xiàn)方法。接下來,我們使用依賴注入實(shí)現(xiàn)控制反轉(zhuǎn),使依賴關(guān)系倒置依賴被動傳入。從單元測試的角度看,依賴注入更方便和操作,方便了測試人員寫出質(zhì)量更高的測試代碼。 前言 好的設(shè)計(jì)會提高程序的可復(fù)用性和可維護(hù)性,也間接的提高了開發(fā)人員的生產(chǎn)力。今天,我們就來說一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...
摘要:反射在每個面向?qū)ο蟮木幊陶Z言中都存在,它的主要目的就是在運(yùn)行時分析類或者對象的狀態(tài),導(dǎo)出或提取出關(guān)于類方法屬性參數(shù)等的詳細(xì)信息,包括注釋。反射是操縱面向?qū)ο蠓缎椭性P偷?,可用于?gòu)建復(fù)雜,可擴(kuò)展的應(yīng)用。 反射在每個面向?qū)ο蟮木幊陶Z言中都存在,它的主要目的就是在運(yùn)行時分析類或者對象的狀態(tài),導(dǎo)出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細(xì)信息,包括注釋。 反射是操縱面向?qū)ο蠓缎椭性P偷?AP...
摘要:反射機(jī)制反射機(jī)制從開始支持,做業(yè)務(wù)開發(fā)的話應(yīng)該很少接觸反射。我的理解就是反射機(jī)制能拿到類里面的屬性方法,和的也可以以上是官方文檔中給出的東西,說實(shí)話我看了感覺沒什么感覺。在容器成員變量中數(shù)組維護(hù)這個類,反射實(shí)例調(diào)用構(gòu)造函數(shù),獲取返回值。 PHP反射機(jī)制 PHP反射機(jī)制從PHP5開始支持,做業(yè)務(wù)開發(fā)的話應(yīng)該很少接觸反射。我其實(shí)也是接觸不多,最近在學(xué)習(xí)laravel的優(yōu)雅,就接觸了到它其中...
摘要:框架中就是使用服務(wù)容器來實(shí)現(xiàn)控制反轉(zhuǎn)和依賴注入。容器依賴注入的實(shí)現(xiàn)實(shí)現(xiàn)原理需要了解的知識點(diǎn)閉包匿名函數(shù)匿名函數(shù),也叫閉包函數(shù),允許臨時創(chuàng)建一個沒有指定名稱的函數(shù)反射以上版本具有完整的反射,添加了對類接口函數(shù)方法和擴(kuò)展進(jìn)行反向工程的能力。 前言 通過實(shí)現(xiàn)laravel 框架功能,以便深入理解laravel框架的先進(jìn)思想。 什么是服務(wù)容器 服務(wù)容器是用來管理類依賴與運(yùn)行依賴注入的工具。La...
閱讀 3057·2021-11-23 09:51
閱讀 3835·2021-11-22 15:29
閱讀 3295·2021-10-08 10:05
閱讀 1622·2021-09-22 15:20
閱讀 1045·2019-08-30 15:56
閱讀 1138·2019-08-30 15:54
閱讀 789·2019-08-26 11:54
閱讀 2692·2019-08-26 11:32