欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP進階學習之反射基本概念與用法分析

 更新時間:2019年06月18日 10:25:15   作者:George-Henry  
這篇文章主要介紹了PHP進階學習之反射基本概念與用法,結(jié)合實例形式分析了php反射的概念、原理基本用法及相關(guān)操作注意事項,需要的朋友可以參考下

本文實例講述了PHP進階學習之反射基本概念與用法。分享給大家供大家參考,具體如下:

一、前言

Reflection(反射)是Java程序開發(fā)語言的特征之一,它允許運行中的Java程序?qū)ψ陨磉M行檢查,或者說“自審”,并能直接操作程序的內(nèi)部屬性。這一特征在實際應(yīng)用中也許用得不是很多。

PHP從5.0開始完美支持反射API。PHP反射可以用于觀察并修改程序在運行時的行為。一個面向反射的(reflection-oriented)程序組件可以監(jiān)測一個范圍內(nèi)的代碼執(zhí)行情況,可以根據(jù)期望的目標與此相關(guān)的范圍修改本身。PHP5具有完整的反射API,添加了對類、接口、函數(shù)、方法和擴展進行反向工程的能力。

二、概念

反射是指在PHP運行狀態(tài)中,擴展分析PHP程序,導出或提出關(guān)于類、方法、屬性、參數(shù)等的詳細信息,包括注釋。這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為反射API。

三、PHP反射的基本語法

實現(xiàn)反射的方法有很多,可以通過實例化一個專門控制類的ReflectionClass類來實現(xiàn)反射,也可以在已有類實例的情況下,通過直接實例化ReflectionMethod類來執(zhí)行反射方法,原理如圖:

以下是對反射類和反射方法類的基本用法:

1、反射類

(1) $reflectClass = new ReflectionClass(<類名>);

傳入類名字符串,返回控制目標類的ReflectionClass類實例;

(2) $reflectClass->getConstant(<常量名>);

傳入類中定義了的常量名,返回常量值,可通過$reflectClass->getConstants返回類中所有定義的常量的數(shù)組;

(3) $class = $reflectClass->newInstance();

實例化類,返回目標類實例;也可通過$reflectClass->newInstanceArgs(<參數(shù)數(shù)組>)傳入實例化的構(gòu)造函數(shù)參數(shù)進行實例化;

2、反射方法

(1) $reflectMethod = new ReflectionMethod(<方法名>);

傳入方法名名字符串,返回控制目標方法的ReflectionMethod類實例;

(2) $parameters = $reflectMethod->getParameters();

獲取該類所需的參數(shù)名,該方法返回一個包含所有參數(shù)名的二維數(shù)組;

(3) $name = $parameters->getName();

返回要執(zhí)行的方法所需參數(shù)數(shù)組的單個參數(shù)名,可通過foreach循環(huán)逐一獲取和賦值;

(4) $reflectMethod->invokeArgs(<類實例>,<執(zhí)行該方法所需參數(shù)數(shù)組>);

傳入類實例和方法參數(shù),執(zhí)行方法,返回執(zhí)行結(jié)果。

3、反射類和反射方法中其他常用的用法:

ReflectionClass:

ReflectionMethod:

4、除了ReflectionClass和ReflectionMethod,我們對于類中的參數(shù)、屬性和php服務(wù)的環(huán)境變量、擴展等參數(shù)也是可以通過反射API的一些方法來執(zhí)行的,如下:

四、反射在實際應(yīng)用中的使用

1、反射可以用于文檔、文件生成??梢杂盟鼘ξ募锏念愡M行掃描,逐個生成描述文檔;
2、既然反射可以探知類的內(nèi)部結(jié)構(gòu),那么可以用它做hook實現(xiàn)插件功能
3、可以用于做動態(tài)代理,在未知或者不確定類名的情況下,動態(tài)生成和實例化一些類和執(zhí)行方法;
4、對于多次繼承的類,我們可以通過多次反射探索到基類的結(jié)構(gòu),或者采用遞歸的形式反射,實現(xiàn)實例化所有繼承類,這即是PHP依賴注入的原理。

五、PHP反射的優(yōu)缺點

優(yōu)點

1、支持反射的語言提供了一些在低級語言中難以實現(xiàn)的運行時特性。
2、可以在一定程度上避免硬編碼,提供靈活性和通用性。
3、可以作為一個第一類對象發(fā)現(xiàn)并修改源代碼的結(jié)構(gòu)(如代碼塊、類、方法、協(xié)議等)。
4、可以在運行時像對待源代碼語句一樣計算符號語法的字符串(類似JavaScript的eval()函數(shù)),進而可將跟class或function匹配的字符串轉(zhuǎn)換成class或function的調(diào)用或引用。
5、可以創(chuàng)建一個新的語言字節(jié)碼解釋器來給編程結(jié)構(gòu)一個新的意義或用途。

劣勢

1、此技術(shù)的學習成本高。面向反射的編程需要較多的高級知識,包括框架、關(guān)系映射和對象交互,以利用更通用的代碼執(zhí)行。
2、同樣因為反射的概念和語法都比較抽象,過多地濫用反射技術(shù)會使得代碼難以被其他人讀懂,不利于合作與交流。
3、由于將部分信息檢查工作從編譯期推遲到了運行期,此舉在提高了代碼靈活性的同時,犧牲了一點點運行效率
4、通過深入學習反射的特性和技巧,它的劣勢可以盡量避免,但這需要許多時間和經(jīng)驗的積累。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對大家PHP程序設(shè)計有所幫助。

相關(guān)文章

最新評論