PHP變量與類(lèi)型擴(kuò)展之反射及其使用
PHP 5 具有完整的反射 API,添加了對(duì)類(lèi)、接口、函數(shù)、方法和擴(kuò)展進(jìn)行反向工程的能力。 此外,反射 API 提供了方法來(lái)取出函數(shù)、類(lèi)和方法中的文檔注釋。
請(qǐng)注意部分內(nèi)部?API?丟失了反射擴(kuò)展工作所需的代碼。 例如,一個(gè)內(nèi)置的 PHP 類(lèi)可能丟失了反射屬性的數(shù)據(jù)。這些少數(shù)的情況被認(rèn)為是錯(cuò)誤,不過(guò), 正因?yàn)槿绱耍鼈儜?yīng)該被發(fā)現(xiàn)和修復(fù)。
使用這些函數(shù)不需要安裝,它們是 PHP 核心的一部分。
二、使用范例在反射文檔中存在很多例子,通常位于每個(gè)類(lèi)的 __construct 文檔中。
Example ?Shell 里的一個(gè)反射例子(一個(gè)終端)
$ php --rf strlen$ php --rc finfo$ php --re json$ php --ri dom
以上例程的輸出類(lèi)似于:
Function [ <internal:Core> function strlen ] { - Parameters [1] { Parameter #0 [ <required> $str ] }}Class [ <internal:fileinfo> class finfo ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [4] { Method [ <internal:fileinfo, ctor> public method finfo ] { - Parameters [2] {Parameter #0 [ <optional> $options ]Parameter #1 [ <optional> $arg ] } } Method [ <internal:fileinfo> public method set_flags ] { - Parameters [1] {Parameter #0 [ <required> $options ] } } Method [ <internal:fileinfo> public method file ] { - Parameters [3] {Parameter #0 [ <required> $filename ]Parameter #1 [ <optional> $options ]Parameter #2 [ <optional> $context ] } } Method [ <internal:fileinfo> public method buffer ] { - Parameters [3] {Parameter #0 [ <required> $string ]Parameter #1 [ <optional> $options ]Parameter #2 [ <optional> $context ] } } }}Extension [ <persistent> extension #23 json version 1.2.1 ] { - Constants [10] { Constant [ integer JSON_HEX_TAG ] { 1 } Constant [ integer JSON_HEX_AMP ] { 2 } Constant [ integer JSON_HEX_APOS ] { 4 } Constant [ integer JSON_HEX_QUOT ] { 8 } Constant [ integer JSON_FORCE_OBJECT ] { 16 } Constant [ integer JSON_ERROR_NONE ] { 0 } Constant [ integer JSON_ERROR_DEPTH ] { 1 } Constant [ integer JSON_ERROR_STATE_MISMATCH ] { 2 } Constant [ integer JSON_ERROR_CTRL_CHAR ] { 3 } Constant [ integer JSON_ERROR_SYNTAX ] { 4 } } - Functions { Function [ <internal:json> function json_encode ] { - Parameters [2] {Parameter #0 [ <required> $value ]Parameter #1 [ <optional> $options ] } } Function [ <internal:json> function json_decode ] { - Parameters [3] {Parameter #0 [ <required> $json ]Parameter #1 [ <optional> $assoc ]Parameter #2 [ <optional> $depth ] } } Function [ <internal:json> function json_last_error ] { - Parameters [0] { } } }}domDOM/XML => enabledDOM/XML API Version => 20031129libxml Version => 2.7.3HTML Support => enabledXPath Support => enabledXPointer Support => enabledSchema Support => enabledRelaxNG Support => enabled三、相關(guān)擴(kuò)展
如果你想創(chuàng)建內(nèi)建類(lèi)的專(zhuān)門(mén)版本(比如說(shuō),在創(chuàng)建并導(dǎo)出高亮 HTML 時(shí),以易于訪問(wèn)的成員變量來(lái)取代方法或使用實(shí)用的方法), 你可以繼續(xù)并擴(kuò)展它們。
Example #1 擴(kuò)展內(nèi)置的類(lèi)
<?php/** * My Reflection_Method class */class My_Reflection_Method extends ReflectionMethod{ public $visibility = array();
public function __construct($o, $m) { parent::__construct($o, $m); $this->visibility = Reflection::getModifierNames($this->getModifiers()); }}/** * Demo class #1 * */class T { protected function x() {}}/** * Demo class #2 * */class U extends T { function x() {}}// 輸出信息var_dump(new My_Reflection_Method(’U’, ’x’));?>
以上例程的輸出類(lèi)似于:
object(My_Reflection_Method)#1 (3) { ['visibility']=> array(1) { [0]=> string(6) 'public' } ['name']=> string(1) 'x' ['class']=> string(1) 'U'}
如果你重寫(xiě)了構(gòu)造函數(shù),記住在寫(xiě)任何插入的代碼之前要先調(diào)用父類(lèi)的構(gòu)造函數(shù)。 不這么做將會(huì)導(dǎo)致以下的結(jié)果:?Fatal error: Internal error: Failed to retrieve the reflection object
四、反射類(lèi)Reflection?— Reflection 類(lèi)
ReflectionClass?— ReflectionClass 類(lèi)
ReflectionZendExtension?— ReflectionZendExtension 類(lèi)
ReflectionExtension?— ReflectionExtension 類(lèi)
ReflectionFunction?— ReflectionFunction 類(lèi)
ReflectionFunctionAbstract?— ReflectionFunctionAbstract 類(lèi)
ReflectionMethod?— ReflectionMethod 類(lèi)
ReflectionObject?— ReflectionObject 類(lèi)
ReflectionParameter?— ReflectionParameter 類(lèi)
ReflectionProperty?— ReflectionProperty 類(lèi)
Reflector?— Reflector 接口
ReflectionException?— ReflectionException 類(lèi)
相關(guān)文章:
1. IntelliJ IDEA安裝插件的方法步驟2. Docker 部署 Prometheus的安裝詳細(xì)教程3. idea重置默認(rèn)配置的方法步驟4. idea導(dǎo)入maven項(xiàng)目的方法5. IntelliJ IDEA設(shè)置自動(dòng)提示功能快捷鍵的方法6. idea設(shè)置代碼格式化的方法步驟7. IntelliJ IDEA調(diào)整字體大小的方法8. 通過(guò)Django Admin+HttpRunner1.5.6實(shí)現(xiàn)簡(jiǎn)易接口測(cè)試平臺(tái)9. idea打開(kāi)多個(gè)窗口的操作方法10. idea給項(xiàng)目打war包的方法步驟

網(wǎng)公網(wǎng)安備