欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP的反射是什么意思-創(chuàng)新互聯(lián)

本篇內(nèi)容主要講解“PHP的反射是什么意思”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“PHP的反射是什么意思”吧!

創(chuàng)新互聯(lián)于2013年開(kāi)始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元嵊州做網(wǎng)站,已為上家服務(wù),為嵊州各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

反射是什么意思


從一個(gè)簡(jiǎn)單的例子理解反射:人有五官四肢,但鮮有人清楚人體內(nèi)部的經(jīng)脈走向、骨骼構(gòu)造。如果你修仙順利,在丹田深處練出元嬰,那么就通過(guò)元嬰透析身體內(nèi)部的構(gòu)造。理解內(nèi)部構(gòu)造后,還可以讓元嬰指引體內(nèi)真氣在經(jīng)脈的流向,早日修成正果。

如其名,反射是(從鏡子里)照出自身。我們寫代碼,告訴代碼怎么運(yùn)行,事件發(fā)生在編譯期。代碼運(yùn)行期間,代碼如何知道自己的結(jié)構(gòu)以及能力呢?反射機(jī)制相當(dāng)于代碼的元嬰,使代碼能夠感知自身結(jié)構(gòu),并可(部分)改變運(yùn)行行為。

與運(yùn)行時(shí)類型信息(Runtime Type Informatiion, RTTI)不同,反射重點(diǎn)在運(yùn)行時(shí)檢測(cè)、感知、改變自身的結(jié)構(gòu)和行為。反射是元編程(metaprogramming)的重要組成部分。

反射API

反射不是語(yǔ)法分析,不操作表達(dá)式、代碼語(yǔ)句。反射獲取的是代碼的結(jié)構(gòu),即函數(shù)、類這些構(gòu)件的結(jié)構(gòu)。PHP中的反射API均以Reflection開(kāi)頭(接口Reflector除外),重點(diǎn)在函數(shù)和類兩種結(jié)構(gòu)。而函數(shù)可以看成類的成員函數(shù)(多一個(gè)隱式的this參數(shù))或者靜態(tài)成員函數(shù)(public類型),所以了解反射API可從類信息的ReflectionClass開(kāi)始。

ReflectionClass提供了以下獲取類基本信息的接口:

getProperties:獲取成員變量/屬性,返回一個(gè)ReflectionProperty數(shù)組;ReflectionProperty類中有對(duì)屬性詳細(xì)說(shuō)明的API:是否默認(rèn)屬性(isDefault),是否私有屬性(isPrivate)等。同時(shí)ReflectionClass還提供獲取特定類別屬性的API:getDefaultProperties,getStaticProperties;

getConstants:獲取類中定義的常量;

getMethods:獲取類中定義的方法,返回一個(gè)ReflectionMethod數(shù)組;ReflectionMethod將在下文講解;

getInterfaces:獲取類實(shí)現(xiàn)的接口;

getParentClass:獲取父類的ReflectionClass實(shí)例。

在反射中,類、接口、特性不分家,所以ReflectionClass提供類型判定API:isInterface、isTrait。

除了以上基本信息,ReflectionClass(包括ReflectionMethod/ReflectionFunction)還提供了一些不可思議的能力:

getDocComment:獲取類的文檔注釋信息;

getFilename:獲取類定義的文件;

getStartLine: 獲取類定義的起始行號(hào);

getEndLine: 獲取類定義的結(jié)束行號(hào);

getModifiers:獲取類定義的修飾符,其意義名字可通過(guò)Reflection::getModifierNames得到,例如:abstract,final。

如果說(shuō)前述的類結(jié)構(gòu)信息可以通過(guò)現(xiàn)有的API獲取(method_exits/property_exits等),上面列出的功能基本上只能通過(guò)反射API獲取(PHP文件中定義的類并且知道定義文件,可以利用token_get_all得到相同結(jié)果,但是實(shí)現(xiàn)非常復(fù)雜)。這些行為發(fā)生在運(yùn)行期間。由此可見(jiàn)反射API在分析類結(jié)構(gòu)信息功能上的強(qiáng)大。

除了ReflectionClass,ReflectionMethod和ReflectionFunction是另外反射中另外兩個(gè)重要的類。函數(shù)(function)定義在類外部,方法(method)定義在類內(nèi)部,兩者其實(shí)同源,在反射API中有共同的父類:ReflectionFunctionAbstract。ReflectionFunctionAbstract有兩者的大部分API,并且基本上是最重要的API。其中最值得關(guān)注的是其參數(shù)信息的API:getParameters。其獲取函數(shù)的參數(shù)信息,返回一個(gè)ReflectionParameter數(shù)組。結(jié)合getParameters和ReflectionParameter,函數(shù)(方法)的結(jié)構(gòu)基本上就清晰了。

API操作

知道人體構(gòu)造和體內(nèi)真氣分布,你可以引導(dǎo)真氣到手指,練成一陽(yáng)指、六脈神劍、彈指神通、九陰白骨爪等;也可以讓真氣匯聚,沖破任督二脈,開(kāi)辟洞天;還可以逆轉(zhuǎn)全身經(jīng)脈,練成蛤蟆功…內(nèi)省的好處可見(jiàn)一斑。

反射讓代碼感知自身結(jié)構(gòu),有什么好處呢?反射API提供了三種在運(yùn)行時(shí)對(duì)代碼操作的能力:

設(shè)置訪問(wèn)控制權(quán):setAccessible??色@取私有的方法/屬性。注意:setAccessible只是讓方法/成員變量可以invoke/getValue/setValue,并不代表類定義的訪問(wèn)存取權(quán)限改變;

調(diào)用函數(shù)/方法:invoke/invokeArgs。配合獲取函數(shù)參數(shù)的API,可以安全的傳參和調(diào)用函數(shù),call_user_func(_array)的增強(qiáng)版;

不依賴構(gòu)造函數(shù)生成實(shí)例:newInstanceWithoutConstructor。

以單例來(lái)說(shuō)一下反射API的功能,單例類代碼如下:

# foo.php

class Foo {

private static $id;

private static $instance;

private function __construct() {

++ self::$id;

fwrite(STDOUT, "construct, instance id: " . self::$id . "\n");

}

public static function getSingleton() {

if (self::$instance === null) {

self::$instance = new self();

}

return self::$instance;

}

}

在Foo類中,構(gòu)造函數(shù)是私有,獲取實(shí)例只能通過(guò)getSingleton方法,并且獲取到的是單例。但在反射API加持下,能獲取多個(gè)實(shí)例:

$instance1 = Foo::getSingleton();

var_dump($instance1);

$class = new ReflectionClass("Foo");

$constructor = $class->getConstructor();

if ((ReflectionProperty::IS_PUBLIC & $constructor->getModifiers()) === 0) {

$constructor->setAccessible(true);

}

$instance2 = $class->newInstanceWithoutConstructor();

$constructor->invoke($instance2);

var_dump($instance2);

# 腳本執(zhí)行結(jié)果

construct, instance id: 1

object(Foo)#1 (0) {

}

construct, instance id: 2

object(Foo)#4 (0) {

}

我們成功的生成了兩個(gè)實(shí)例,并調(diào)用構(gòu)造函數(shù)完成對(duì)象初始化。如果沒(méi)有反射API,這幾乎是不可能完成的工作。

除了這三種操作,反射API幾乎已無(wú)在運(yùn)行時(shí)動(dòng)態(tài)改變代碼的行為。但作為動(dòng)態(tài)語(yǔ)言,PHP內(nèi)置了將數(shù)據(jù)轉(zhuǎn)換成代碼執(zhí)行的能力(例如create_function/eval、動(dòng)態(tài)函數(shù)名調(diào)用)。而PHP的好基友JavaScript則可以隨時(shí)在運(yùn)行時(shí)改變?nèi)我夂瘮?shù)的行為:

PHP作為好的語(yǔ)言,理應(yīng)能做到在運(yùn)行時(shí)動(dòng)態(tài)增減/改變函數(shù)定義。這就需要用到另一個(gè)PHP核心開(kāi)發(fā)者“Dmitry Zenovich”打造的大殺器:runkit拓展。這部分內(nèi)容不屬于反射,加之本人了解不深,不再詳述。

從上表可以看出反射API較函數(shù)式API能提供更全面的信息。還需要注意到__FILE__這類魔術(shù)常量是編譯期的工作,不是運(yùn)行時(shí)的能力。

到此,相信大家對(duì)“PHP的反射是什么意思”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)建站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

當(dāng)前標(biāo)題:PHP的反射是什么意思-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://aaarwkj.com/article22/hsscc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷網(wǎng)站策劃、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
亚洲精品黄色片中文字幕| 91午夜福利视频鉴赏| 成人精品淫片一级免费| 久久精品久久精品欧美大片| 久久精品一区二区三区不卡| 日韩视频一区二区三区四区| 乱熟av一区二区三区| 日韩中文字幕一区二区不卡| 欧美精品熟妇乱黑人最大| 午夜啪视频免费在线观看| 熟妇高潮一区二区在线观看| 亚洲欧美日韩在线观看a三区| 精品视频在线观看传媒| 久久婷婷精品国产亚洲av| 国产精品精品久久久久久| 在线激情视频一区二区| 风流少妇奶真白摸的好爽| 亚洲天堂国产成人精品| 国产精品偷伦一区二区| 亚洲国产中日韩精品综合| 亚洲天堂精品日韩电影| 国产粉嫩一区二区三区在线观看| 青青草免费视频观看在线| 久久精品国产欧美日韩| 日本的黄色录像一级带| 婷婷亚洲悠悠色悠在线| 日韩国产欧美亚州精品| 亚洲天堂av在线观看| 欧美一区二区日韩一区二区| 成人性生交大片免费看中文 | 四影虎影永久免费观看| 日本高清一区二区网站| 国产高清学生三级一区二区| 高清一区高清二区高清三区| 亚洲精品黄色在线观看| 欧美日韩精品福利一区二区| 97久久成人国产精品免费| 99国产精品欲av麻豆在线观看| 国产精品男人在线播放| 国产又粗又爽视频免费| 精品中文字幕欧美区一区|