PHP變量與類型擴(kuò)展之反射及其使用
PHP 5 具有完整的反射 API,添加了對(duì)類、接口、函數(shù)、方法和擴(kuò)展進(jìn)行反向工程的能力。 此外,反射 API 提供了方法來(lái)取出函數(shù)、類和方法中的文檔注釋。
請(qǐng)注意部分內(nèi)部?API?丟失了反射擴(kuò)展工作所需的代碼。 例如,一個(gè)內(nèi)置的 PHP 類可能丟失了反射屬性的數(shù)據(jù)。這些少數(shù)的情況被認(rèn)為是錯(cuò)誤,不過(guò), 正因?yàn)槿绱?,它們?yīng)該被發(fā)現(xiàn)和修復(fù)。
使用這些函數(shù)不需要安裝,它們是 PHP 核心的一部分。
二、使用范例在反射文檔中存在很多例子,通常位于每個(gè)類的 __construct 文檔中。
Example ?Shell 里的一個(gè)反射例子(一個(gè)終端)
$ php --rf strlen$ php --rc finfo$ php --re json$ php --ri dom
以上例程的輸出類似于:
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)建類的專門版本(比如說(shuō),在創(chuàng)建并導(dǎo)出高亮 HTML 時(shí),以易于訪問(wèn)的成員變量來(lái)取代方法或使用實(shí)用的方法), 你可以繼續(xù)并擴(kuò)展它們。
Example #1 擴(kuò)展內(nè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’));?>
以上例程的輸出類似于:
object(My_Reflection_Method)#1 (3) { ['visibility']=> array(1) { [0]=> string(6) 'public' } ['name']=> string(1) 'x' ['class']=> string(1) 'U'}
如果你重寫了構(gòu)造函數(shù),記住在寫任何插入的代碼之前要先調(diào)用父類的構(gòu)造函數(shù)。 不這么做將會(huì)導(dǎo)致以下的結(jié)果:?Fatal error: Internal error: Failed to retrieve the reflection object
四、反射類Reflection?— Reflection 類
ReflectionClass?— ReflectionClass 類
ReflectionZendExtension?— ReflectionZendExtension 類
ReflectionExtension?— ReflectionExtension 類
ReflectionFunction?— ReflectionFunction 類
ReflectionFunctionAbstract?— ReflectionFunctionAbstract 類
ReflectionMethod?— ReflectionMethod 類
ReflectionObject?— ReflectionObject 類
ReflectionParameter?— ReflectionParameter 類
ReflectionProperty?— ReflectionProperty 類
Reflector?— Reflector 接口
ReflectionException?— ReflectionException 類
相關(guān)文章:
1. CSS可以做的幾個(gè)令你嘆為觀止的實(shí)例分享2. js的一些潛在規(guī)則使用分析3. HTML5 Canvas繪制圖形從入門到精通4. html小技巧之td,div標(biāo)簽里內(nèi)容不換行5. IE6/IE7/IE8/IE9中tbody的innerHTML不能賦值的完美解決方案6. 低版本IE正常運(yùn)行HTML5+CSS3網(wǎng)站的3種解決方案7. 詳解盒子端CSS動(dòng)畫性能提升8. 利用CSS3新特性創(chuàng)建透明邊框三角9. html清除浮動(dòng)的6種方法示例10. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)
