溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何正確的使用PHP反射

發(fā)布時(shí)間:2020-12-23 15:09:12 來(lái)源:億速云 閱讀:132 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

如何正確的使用PHP反射?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

最近在開(kāi)發(fā)過(guò)程中需要獲取某個(gè)類(lèi)方法的參數(shù)數(shù)量、名稱及參數(shù)順序,好根據(jù)參數(shù)的名稱來(lái)從$_GET里取值。

如方法原型為test($uid,$score), 那么我就知道需要需要從$_GET取

復(fù)制代碼 代碼如下:


$uid = $_GET['uid'];

$score = $_GET['score'];

然后調(diào)用方法$obj->test($uid,$score)

當(dāng)然前提是約定好了參數(shù)名稱和get方法傳值變量名一致。

采用PHP的反射API,獲得函數(shù)參數(shù)名稱和參數(shù)默認(rèn)值的方法如下:

復(fù)制代碼 代碼如下:


<?php 
class testClass{ 
     
    public function testFunc($param1,$param2=0){ 
         
    } 

 
$method = new ReflectionMethod('testClass', 'testFunc'); 
$params = $method--->getParameters(); 
foreach ($params as $param) { 
    echo 'param name: ' . $param->getName(),"\n"; 
    if ($param->isOptional()) { 
        echo 'Default value: ' . $param->getDefaultValue(),"\n"; 
    } 

下面是PHP反射API的介紹:

1、用途:
該擴(kuò)展分析php程序,導(dǎo)出或提取出關(guān)于類(lèi)、方法、屬性、參數(shù)等的詳細(xì)信息,包括注釋。
Reflection可以說(shuō)是對(duì)php庫(kù)函數(shù):“Classes/Objects 類(lèi)/對(duì)象函數(shù)”的一個(gè)擴(kuò)展。
主要用在通過(guò)程序檢測(cè)現(xiàn)有php程序內(nèi)部關(guān)于類(lèi)、方法等信息,并做出處理。

2、API概覽:

復(fù)制代碼 代碼如下:


class Reflection { } 
interface Reflector { } 
class ReflectionException extends Exception { } 
class ReflectionFunction implements Reflector { } 
class ReflectionParameter implements Reflector { } 
class ReflectionMethod extends ReflectionFunction { } 
class ReflectionClass implements Reflector { } 
class ReflectionObject extends ReflectionClass { } 
class ReflectionProperty implements Reflector { } 
class ReflectionExtension implements Reflector { } 

3、詳細(xì)說(shuō)明:(例子詳見(jiàn)php手冊(cè))

復(fù)制代碼 代碼如下:


①Reflection類(lèi) 
<?php 
class Reflection 

public static mixed export(Reflector r [,bool return]) 
//導(dǎo)出一個(gè)類(lèi)或方法的詳細(xì)信息 
public static array getModifierNames(int modifiers) 
//取得修飾符的名字 

?> 
 
②ReflectionException類(lèi) 
 
該類(lèi)繼承標(biāo)準(zhǔn)類(lèi),沒(méi)特殊方法和屬性。 
 
③ReflectionFunction類(lèi) 
<?php 
class ReflectionFunction implements Reflector 

final private __clone() 
public object __construct(string name) 
public string __toString() 
public static string export() 
//導(dǎo)出該函數(shù)的詳細(xì)信息 
public string getName() 
//取得函數(shù)名 
public bool isInternal() 
//測(cè)試是否為系統(tǒng)內(nèi)部函數(shù) 
public bool isUserDefined() 
//測(cè)試是否為用戶自定義函數(shù) 
public string getFileName() 
//取得文件名,包括路徑名 
public int getStartLine() 
//取得定義函數(shù)的起始行 
public int getEndLine() 
//取得定義函數(shù)的結(jié)束行 
public string getDocComment() 
//取得函數(shù)的注釋 
public array getStaticVariables() 
//取得靜態(tài)變量 
public mixed invoke(mixed* args) 
//調(diào)用該函數(shù),通過(guò)參數(shù)列表傳參數(shù) 
public mixed invokeArgs(array args) 
//調(diào)用該函數(shù),通過(guò)數(shù)組傳參數(shù) 
public bool returnsReference() 
//測(cè)試該函數(shù)是否返回引用 
public ReflectionParameter[] getParameters() 
//取得該方法所需的參數(shù),返回值為對(duì)象數(shù)組 
public int getNumberOfParameters() 
//取得該方法所需的參數(shù)個(gè)數(shù) 
public int getNumberOfRequiredParameters() 
//取得該方法所需的參數(shù)個(gè)數(shù) 

?> 
 
④ReflectionParameter類(lèi): 
<?php 
class ReflectionParameter implements Reflector 

final private __clone() 
public object __construct(string name) 
public string __toString() 
public static string export() 
//導(dǎo)出該參數(shù)的詳細(xì)信息 
public string getName() 
//取得參數(shù)名 
public bool isPassedByReference() 
//測(cè)試該參數(shù)是否通過(guò)引用傳遞參數(shù) 
public ReflectionClass getClass() 
//若該參數(shù)為對(duì)象,返回該對(duì)象的類(lèi)名 
public bool isArray() 
//測(cè)試該參數(shù)是否為數(shù)組類(lèi)型 
public bool allowsNull() 
//測(cè)試該參數(shù)是否允許為空 
public bool isOptional() 
//測(cè)試該參數(shù)是否為可選的,當(dāng)有默認(rèn)參數(shù)時(shí)可選 
public bool isDefaultValueAvailable() 
//測(cè)試該參數(shù)是否為默認(rèn)參數(shù) 
public mixed getDefaultValue() 
//取得該參數(shù)的默認(rèn)值 

?> 
 
⑤ReflectionClass類(lèi): 
<?php 
class ReflectionClass implements Reflector 

final private __clone() 
public object __construct(string name) 
public string __toString() 
public static string export() 
//導(dǎo)出該類(lèi)的詳細(xì)信息 
public string getName() 
//取得類(lèi)名或接口名 
public bool isInternal() 
//測(cè)試該類(lèi)是否為系統(tǒng)內(nèi)部類(lèi) 
public bool isUserDefined() 
//測(cè)試該類(lèi)是否為用戶自定義類(lèi) 
public bool isInstantiable() 
//測(cè)試該類(lèi)是否被實(shí)例化過(guò) 
public bool hasConstant(string name) 
//測(cè)試該類(lèi)是否有特定的常量 
public bool hasMethod(string name) 
//測(cè)試該類(lèi)是否有特定的方法 
public bool hasProperty(string name) 
//測(cè)試該類(lèi)是否有特定的屬性 
public string getFileName() 
//取得定義該類(lèi)的文件名,包括路徑名 
public int getStartLine() 
//取得定義該類(lèi)的開(kāi)始行 
public int getEndLine() 
//取得定義該類(lèi)的結(jié)束行 
public string getDocComment() 
//取得該類(lèi)的注釋 
public ReflectionMethod getConstructor() 
//取得該類(lèi)的構(gòu)造函數(shù)信息 
public ReflectionMethod getMethod(string name) 
//取得該類(lèi)的某個(gè)特定的方法信息 
public ReflectionMethod[] getMethods() 
//取得該類(lèi)的所有的方法信息 
public ReflectionProperty getProperty(string name) 
//取得某個(gè)特定的屬性信息 
public ReflectionProperty[] getProperties() 
//取得該類(lèi)的所有屬性信息 
public array getConstants() 
//取得該類(lèi)所有常量信息 
public mixed getConstant(string name) 
//取得該類(lèi)特定常量信息 
public ReflectionClass[] getInterfaces() 
//取得接口類(lèi)信息 
public bool isInterface() 
//測(cè)試該類(lèi)是否為接口 
public bool isAbstract() 
//測(cè)試該類(lèi)是否為抽象類(lèi) 
public bool isFinal() 
//測(cè)試該類(lèi)是否聲明為final 
public int getModifiers() 
//取得該類(lèi)的修飾符,返回值類(lèi)型可能是個(gè)資源類(lèi)型 
//通過(guò)Reflection::getModifierNames($class->getModifiers())進(jìn)一步讀取 
public bool isInstance(stdclass object) 
//測(cè)試傳入的對(duì)象是否為該類(lèi)的一個(gè)實(shí)例 
public stdclass newInstance(mixed* args) 
//創(chuàng)建該類(lèi)實(shí)例 
public ReflectionClass getParentClass() 
//取得父類(lèi) 
public bool isSubclassOf(ReflectionClass class) 
//測(cè)試傳入的類(lèi)是否為該類(lèi)的父類(lèi) 
public array getStaticProperties() 
//取得該類(lèi)的所有靜態(tài)屬性 
public mixed getStaticPropertyValue(string name [, mixed default]) 
//取得該類(lèi)的靜態(tài)屬性值,若private,則不可訪問(wèn) 
public void setStaticPropertyValue(string name, mixed value) 
//設(shè)置該類(lèi)的靜態(tài)屬性值,若private,則不可訪問(wèn),有悖封裝原則 
public array getDefaultProperties() 
//取得該類(lèi)的屬性信息,不含靜態(tài)屬性 
public bool isIterateable() 
public bool implementsInterface(string name) 
//測(cè)試是否實(shí)現(xiàn)了某個(gè)特定接口 
public ReflectionExtension getExtension() 
public string getExtensionName() 

?> 
 
⑥ReflectionMethod類(lèi): 
<?php 
class ReflectionMethod extends ReflectionFunction 

public __construct(mixed class, string name) 
public string __toString() 
public static string export() 
//導(dǎo)出該方法的信息 
public mixed invoke(stdclass object, mixed* args) 
//調(diào)用該方法 
public mixed invokeArgs(stdclass object, array args) 
//調(diào)用該方法,傳多參數(shù) 
public bool isFinal() 
//測(cè)試該方法是否為final 
public bool isAbstract() 
//測(cè)試該方法是否為abstract 
public bool isPublic() 
//測(cè)試該方法是否為public 
public bool isPrivate() 
//測(cè)試該方法是否為private 
public bool isProtected() 
//測(cè)試該方法是否為protected 
public bool isStatic() 
//測(cè)試該方法是否為static 
public bool isConstructor() 
//測(cè)試該方法是否為構(gòu)造函數(shù) 
public bool isDestructor() 
//測(cè)試該方法是否為析構(gòu)函數(shù) 
public int getModifiers() 
//取得該方法的修飾符 
public ReflectionClass getDeclaringClass() 
//取得該方法所屬的類(lèi) 
// Inherited from ReflectionFunction 
final private __clone() 
public string getName() 
public bool isInternal() 
public bool isUserDefined() 
public string getFileName() 
public int getStartLine() 
public int getEndLine() 
public string getDocComment() 
public array getStaticVariables() 
public bool returnsReference() 
public ReflectionParameter[] getParameters() 
public int getNumberOfParameters() 
public int getNumberOfRequiredParameters() 

?> 
 
⑦ReflectionProperty類(lèi): 
<?php 
class ReflectionProperty implements Reflector 

final private __clone() 
public __construct(mixed class, string name) 
public string __toString() 
public static string export() 
//導(dǎo)出該屬性的詳細(xì)信息 
public string getName() 
//取得該屬性名 
public bool isPublic() 
//測(cè)試該屬性名是否為public 
public bool isPrivate() 
//測(cè)試該屬性名是否為private 
public bool isProtected() 
//測(cè)試該屬性名是否為protected 
public bool isStatic() 
//測(cè)試該屬性名是否為static 
public bool isDefault() 
public int getModifiers() 
//取得修飾符 
public mixed getValue(stdclass object) 
//取得該屬性值 
public void setValue(stdclass object, mixed value) 
//設(shè)置該屬性值 
public ReflectionClass getDeclaringClass() 
//取得定義該屬性的類(lèi) 
public string getDocComment() 
//取得該屬性的注釋 

?> 
 
⑧ReflectionExtension類(lèi) 
<?php 
class ReflectionExtension implements Reflector { 
final private __clone() 
public __construct(string name) 
public string __toString() 
 
public static string export() 
//導(dǎo)出該擴(kuò)展的所有信息 
public string getName() 
//取得該擴(kuò)展的名字 
public string getVersion() 
//取得該擴(kuò)展的版本 
public ReflectionFunction[] getFunctions() 
//取得該擴(kuò)展的所有函數(shù) 
public array getConstants() 
//取得該擴(kuò)展的所有常量 
public array getINIEntries() 
//取得與該擴(kuò)展相關(guān)的,在php.ini中的指令信息 
public ReflectionClass[] getClasses() 
public array getClassNames() 

?> 

關(guān)于如何正確的使用PHP反射問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI