亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > PHP反射基礎知識回顧

PHP反射基礎知識回顧

熱門標簽:ai電話機器人加盟代理 OMG地圖標注app 電銷機器人便宜的有嗎 招標自動語音外呼系統 gps 地圖標注軟件 黔江400電話如何辦理 地圖標注視頻廣告入駐 400電話鄭州申請 中原區電話機器人價格

反射是編程語言的高級特性,能在運行時讓代碼有感知代碼的能力。PHP自5起支持反射機制,其是各種OOP框架底層實現的重要支撐。

反射

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

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

與運行時類型信息(Runtime Type Informatiion, RTTI)不同,反射重點在運行時檢測、感知、改變自身的結構和行為。反射是元編程(metaprogramming)的重要組成部分。

PHP反射API

反射不是語法分析,不操作表達式、代碼語句。反射獲取的是代碼的結構,即函數、類這些構件的結構。PHP中的反射API均以Reflection開頭(接口Reflector除外),重點在函數和類兩種結構。而函數可以看成類的成員函數(多一個隱式的this參數)或者靜態成員函數(public類型),所以了解反射API可從類信息的ReflectionClass開始。

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

  1. getProperties:獲取成員變量/屬性,返回一個ReflectionProperty數組;ReflectionProperty類中有對屬性詳細說明的API:是否默認屬性(isDefault),是否私有屬性(isPrivate)等。同時ReflectionClass還提供獲取特定類別屬性的API:getDefaultPropertiesgetStaticProperties
  2. getConstants:獲取類中定義的常量;
  3. getMethods:獲取類中定義的方法,返回一個ReflectionMethod數組;ReflectionMethod將在下文講解;
  4. getInterfaces:獲取類實現的接口;
  5. getParentClass:獲取父類的ReflectionClass實例。

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

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

  1. getDocComment:獲取類的文檔注釋信息;
  2. getFilename:獲取類定義的文件;
  3. getStartLine: 獲取類定義的起始行號;
  4. getEndLine: 獲取類定義的結束行號;
  5. getModifiers:獲取類定義的修飾符,其意義名字可通過Reflection::getModifierNames得到,例如:abstract,final。

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

除了ReflectionClassReflectionMethodReflectionFunction是另外反射中另外兩個重要的類。函數(function)定義在類外部,方法(method)定義在類內部,兩者其實同源,在反射API中有共同的父類:ReflectionFunctionAbstractReflectionFunctionAbstract有兩者的大部分API,并且基本上是最重要的API。其中最值得關注的是其參數信息的API:getParameters。其獲取函數的參數信息,返回一個ReflectionParameter數組。結合getParametersReflectionParameter,函數(方法)的結構基本上就清晰了。

API操作

知道人體構造和體內真氣分布,你可以引導真氣到手指,練成一陽指、六脈神劍、彈指神通、九陰白骨爪等;也可以讓真氣匯聚,沖破任督二脈,開辟洞天;還可以逆轉全身經脈,練成蛤蟆功…內省的好處可見一斑。

反射讓代碼感知自身結構,有什么好處呢?反射API提供了三種在運行時對代碼操作的能力:

  1. 設置訪問控制權:setAccessible。可獲取私有的方法/屬性。注意:setAccessible只是讓方法/成員變量可以invoke/getValue/setValue,并不代表類定義的訪問存取權限改變;
  2. 調用函數/方法:invoke/invokeArgs。配合獲取函數參數的API,可以安全的傳參和調用函數,call_user_func(_array)的增強版;
  3. 不依賴構造函數生成實例:newInstanceWithoutConstructor

以單例來說一下反射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類中,構造函數是私有,獲取實例只能通過getSingleton方法,并且獲取到的是單例。但在反射API加持下,能獲取多個實例:

$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);

# 腳本執行結果
construct, instance id: 1
object(Foo)#1 (0) {
}
construct, instance id: 2
object(Foo)#4 (0) {
}

我們成功的生成了兩個實例,并調用構造函數完成對象初始化。如果沒有反射API,這幾乎是不可能完成的工作。

除了這三種操作,反射API幾乎已無在運行時動態改變代碼的行為。但作為動態語言,PHP內置了將數據轉換成代碼執行的能力(例如create_function/eval、動態函數名調用)。而PHP的好基友JavaScript則可以隨時在運行時改變任意函數的行為:

PHP作為最好的語言,理應能做到在運行時動態增減/改變函數定義。這就需要用到另一個PHP核心開發者“Dmitry Zenovich”打造的大殺器:runkit拓展。這部分內容不屬于反射,加之本人了解不深,不再詳述。

對比

整理一下反射API和函數式API在功能上的差異:

功能 函數式API 反射API
函數是否存在 function_exists ReflectionFunction
類是否存在 class_exits ReflectionClass
方法是否存在 method_exits ReflectionMethod
變量/屬性是否存在 property_exits ReflectionProperty
獲取類變量 get_class_vars ReflectionClass::getProperties
獲取類方法 get_class_methods ReflectionClass::getMethods
獲取類常量 ReflectionClass::RegetReflectionConstant(s)
獲取函數/方法參數信息 ReflectionFunction/Method::getParameters
獲取函數/方法返回值 ReflectionFunction/Method::getReturnType
類使用的特性 class_uses ReflectionClass::getTraits
獲取父類 class_parents ReflectionClass::getParentClass
獲取類實現的接口 class_implements ReflectionClass::getInterfaceNames
獲取類所在名字空間 __NAMESPACE__ ReflectionClass::getNamespaceName
函數調用 call_user_func(_array) ReflectionMethod(Function)::invoke(Args)
獲取類名 __CLASS__/::class ReflectionClass::getName
獲取函數名 __METHOD__/__FUNCTION__ ReflectionFunction/Method::getName
獲取類/常量/變量/方法修飾符 ReflectionClass/Constant/Property/Method::getModifiers
獲取所在文件 __FILE__ ReflectionClass/Constant/Function/Method::getFileName
獲取所在行(范圍) ReflectionClass/Function/Method::getStartLine/getEndLine
獲取文檔 ReflectionClass/Function/Method::getDocComment
extension_loaded ReflectionZendExtension
拓展 get_loaded_extensions ReflectionExtension
get_extension_funcs

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

同時給出RTTI的函數式API和反射API在功能上的差異:

功能 函數式API 反射API
類型判斷 is_int/is_bool/is_array等
獲取對象的類名 get_class ReflectionObject::getName
獲取對象父類 get_parent_class ReflectionObject::getParentClass
類型/繼承檢測 instanceof/is_a/is_subclass_of ReflectionObject::isInstance/isSubclassOf
生成器 ReflectionGenerator

總結

本文對PHP中的反射機制做了簡要總結,并與在運行時獲取代碼信息的函數式API做了對比。即使你token_get_all用得再熟練,preg_match等文本操作用得再順手,反射API仍有其獨到一面,值得了解。如本人之前博文“PHP中的重載”所言,有了反射,function_exits/class_exitscall_user_func這些函數應該可以退休。但是考慮到兼容、使用便利、運行效率等因素,許多框架仍然依賴這些API。

感謝閱讀,歡迎指正!

以上就是PHP反射知識回顧的詳細內容,更多關于PHP 反射的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • PHP的反射動態獲取類方法、屬性、參數操作示例
  • php面試實現反射注入的詳細方法
  • PHP反射原理與用法深入分析
  • php提供實現反射的方法和實例代碼
  • PHP進階學習之反射基本概念與用法分析
  • php反射學習之不用new方法實例化類操作示例
  • PHP反射學習入門示例
  • PHP反射實際應用示例
  • 用PHP的反射實現委托模式的講解
  • 淺析PHP類的反射來實現依賴注入過程
  • PHP基于反射機制實現自動依賴注入的方法詳解
  • PHP基于反射獲取一個類中所有的方法

標簽:那曲 孝感 北京 日照 哈密 阿里 濟源 池州

巨人網絡通訊聲明:本文標題《PHP反射基礎知識回顧》,本文關鍵詞  PHP,反射,基礎知識,回顧,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP反射基礎知識回顧》相關的同類信息!
  • 本頁收集關于PHP反射基礎知識回顧的相關信息資訊供網民參考!
  • 推薦文章
    午夜精品国产自在现线拍| 午夜激情视频在线播放| 尤物视频网站在线| 亚洲女人国产香蕉久久精品| 国产一区二区精品久久| 欧美激情伊人| 欧美国产日韩一区二区三区| 香蕉视频久久| 色综合久久天天综合绕观看| 久久精品大片| 成人在免费观看视频国产| 欧美爱色| 欧美大片一区| 毛片的网站| 999久久狠狠免费精品| 久草免费在线色站| 色综合久久天天综合观看| 日韩在线观看免费| 国产麻豆精品视频| 中文字幕一区二区三区 精品| 久草免费在线观看| 一级女人毛片人一女人| 亚洲天堂免费| 99久久精品国产高清一区二区| 免费国产在线观看不卡| 国产a视频精品免费观看| 国产成人精品综合久久久| 天堂网中文在线| 高清一级做a爱过程不卡视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 一级片免费在线观看视频| 国产一区二区精品久久| 久久精品道一区二区三区| 精品视频在线看| 成人在激情在线视频| 国产原创视频在线| 美女免费精品高清毛片在线视| 精品久久久久久影院免费| 亚洲不卡一区二区三区在线| 国产91精品一区| 欧美另类videosbestsex高清| 亚洲第一页乱| 91麻豆精品国产自产在线观看一区| a级黄色毛片免费播放视频| 亚洲精品影院一区二区| 欧美爱爱网| 国产不卡在线观看| 成人免费观看的视频黄页| 国产亚洲精品aaa大片| 久久国产精品自由自在| 日本伦理片网站| 国产麻豆精品| 亚洲精品影院| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 亚洲第一色在线| 韩国三级香港三级日本三级la | 欧美1区2区3区| 精品视频一区二区三区| 成人免费高清视频| 免费国产一级特黄aa大片在线| 久草免费在线观看| 91麻豆精品国产高清在线| 免费一级片在线| 久久99中文字幕| 精品视频在线观看免费| 欧美激情一区二区三区视频高清| 久久国产精品只做精品| 尤物视频网站在线| 999久久66久6只有精品| 午夜在线亚洲| 欧美爱爱网| 香蕉视频亚洲一级| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产亚洲精品aaa大片| 久草免费资源| 尤物视频网站在线| 日本特黄一级| 亚洲女初尝黑人巨高清在线观看| 成人在激情在线视频| 精品国产亚一区二区三区| 韩国三级视频网站| 国产精品自拍一区| 日韩在线观看视频网站| 青青久久精品| 国产不卡精品一区二区三区| 久久精品店| 九九久久国产精品大片| 日韩综合| 国产一区二区高清视频| 一级女性全黄久久生活片| 欧美激情一区二区三区视频 | 欧美国产日韩在线| 尤物视频网站在线观看| 99久久精品国产免费| 国产视频久久久| 久久99中文字幕久久| 九九精品影院| 欧美日本免费| 免费国产在线观看| 香蕉视频一级| 99色视频| 精品久久久久久中文| 韩国三级香港三级日本三级la | 成人影视在线观看| 高清一级毛片一本到免费观看| 天天做日日爱夜夜爽| 日本免费乱理伦片在线观看2018| 午夜精品国产自在现线拍| 日韩专区一区| 成人av在线播放| 欧美国产日韩一区二区三区| 日韩av片免费播放| 一本高清在线| 久久国产一区二区| 亚洲天堂免费| 日韩免费在线视频| 一级毛片视频播放| 999久久久免费精品国产牛牛| 精品毛片视频| 久久99这里只有精品国产| 久草免费资源| 天天做日日爱夜夜爽| 美女被草网站| 日本在线不卡视频| 999久久狠狠免费精品| 麻豆午夜视频| 国产91丝袜高跟系列| 成人av在线播放| 超级乱淫伦动漫| 精品视频在线观看免费| 免费毛片基地| 国产成+人+综合+亚洲不卡| 欧美激情一区二区三区视频| 色综合久久天天综合绕观看| 一 级 黄 中国色 片| 欧美国产日韩在线| 国产一区二区福利久久| 99久久精品国产高清一区二区| 一级女性全黄生活片免费| 欧美爱爱网| 高清一级片| 亚洲wwwwww| 精品毛片视频| 人人干人人插| 国产激情一区二区三区| 超级乱淫伦动漫| 国产视频一区在线| 日韩免费在线| 你懂的国产精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 青青久久精品| 一级女性大黄生活片免费| 精品国产一区二区三区国产馆| 91麻豆国产福利精品| 国产麻豆精品hdvideoss| 精品视频免费观看| 成人a大片在线观看| 91麻豆国产福利精品| 精品国产一区二区三区精东影业| 欧美国产日韩在线| 91麻豆爱豆果冻天美星空| 久久国产影视免费精品| 欧美α片无限看在线观看免费| 国产极品白嫩美女在线观看看| 一级片免费在线观看视频| 精品国产香蕉在线播出| 久久久久久久男人的天堂| 国产成人精品一区二区视频| 国产极品白嫩美女在线观看看| 国产伦精品一区二区三区在线观看 | 99热视热频这里只有精品| 99热精品一区| 久草免费资源| 四虎影视久久久| 999久久久免费精品国产牛牛| 亚洲第一视频在线播放| 国产精品自拍一区| 国产高清在线精品一区a| 91麻豆tv| 九九久久国产精品大片| 欧美激情一区二区三区在线| 国产视频一区二区在线播放| 免费毛片播放| 国产一区精品| 日本免费乱人伦在线观看| 国产韩国精品一区二区三区| 999久久狠狠免费精品| 欧美日本国产| 国产亚洲免费观看| 久久国产精品自线拍免费| a级毛片免费观看网站| 一级毛片视频免费| 青青久久国产成人免费网站| 亚洲精品永久一区| 91麻豆精品国产片在线观看| 亚洲天堂免费| 天天做日日爱| 国产网站免费视频| 国产成人啪精品| 久久久久久久网|