濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法分析

PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法分析

熱門標(biāo)簽:余姚電話機(jī)器人 百度地圖標(biāo)注偏差 外呼系統(tǒng)能給企業(yè)帶來(lái)哪些好處 電銷機(jī)器人問(wèn)門薩維品牌my 百度地圖怎樣標(biāo)注圖標(biāo) 廣東廣州在怎么申請(qǐng)400電話 400電話蘭州申請(qǐng)請(qǐng) 開發(fā)地圖標(biāo)注類網(wǎng)站 咸寧銷售電銷機(jī)器人系統(tǒng)

本文實(shí)例講述了PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法。分享給大家供大家參考,具體如下:

一、前言

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

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

二、概念

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

三、PHP反射的基本語(yǔ)法

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

以下是對(duì)反射類和反射方法類的基本用法:

1、反射類

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

傳入類名字符串,返回控制目標(biāo)類的ReflectionClass類實(shí)例;

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

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

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

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

2、反射方法

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

傳入方法名名字符串,返回控制目標(biāo)方法的ReflectionMethod類實(shí)例;

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

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

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

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

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

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

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

ReflectionClass:

ReflectionMethod:

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

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

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

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

優(yōu)點(diǎn)

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

劣勢(shì)

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

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

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

您可能感興趣的文章:
  • PHP的反射動(dòng)態(tài)獲取類方法、屬性、參數(shù)操作示例
  • php面試實(shí)現(xiàn)反射注入的詳細(xì)方法
  • PHP反射原理與用法深入分析
  • php提供實(shí)現(xiàn)反射的方法和實(shí)例代碼
  • php反射學(xué)習(xí)之不用new方法實(shí)例化類操作示例
  • PHP反射學(xué)習(xí)入門示例
  • PHP反射實(shí)際應(yīng)用示例
  • 用PHP的反射實(shí)現(xiàn)委托模式的講解
  • 淺析PHP類的反射來(lái)實(shí)現(xiàn)依賴注入過(guò)程
  • PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴注入的方法詳解
  • PHP基于反射獲取一個(gè)類中所有的方法
  • PHP反射基礎(chǔ)知識(shí)回顧

標(biāo)簽:衡陽(yáng) 十堰 麗江 重慶 巴彥淖爾 臨沂 銅陵 鷹潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法分析》,本文關(guān)鍵詞  PHP,進(jìn)階,學(xué),習(xí)之,反射,基本概念,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法分析》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    五莲县| 扎赉特旗| 东光县| 泸西县| 东城区| 沅陵县| 晋城| 儋州市| 垫江县| 玉林市| 大埔区| 阜宁县| 贡山| 荆门市| 禄劝| 区。| 苏尼特左旗| 焦作市| 沙湾县| 诸城市| 西青区| 高青县| 太湖县| 长汀县| 博野县| 南城县| 漾濞| 丹寨县| 中山市| 股票| 资中县| 泸州市| 腾冲县| 呼图壁县| 南和县| 京山县| 宜川县| 时尚| 叙永县| 陵川县| 余庆县|