PHP Reflection API詳解

來源:互聯網
上載者:User

   這篇文章主要介紹了PHP Reflection API詳解,本文講解了Reflection類、ReflectionException類、ReflectionFunction類、ReflectionParameter類、ReflectionClass類、ReflectionMethod類等內容,需要的朋友可以參考下

  PHP Reflection API是PHP5才有的新功能,它是用來匯出或提取出關於類、方法、屬性、參數等的詳細資料,包括注釋。

  PHP Reflection API有:

  ?

1 2 3 4 5 6 7 8 9 10 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 { }

  具體API說明:

  ①Reflection類

  ?

1 2 3 4 5 6 7 8 9 <?php class Reflection { public static mixed export(Reflector r [,bool return]) //匯出一個類或方法的詳細資料 public static array getModifierNames(int modifiers) //取得修飾符的名字 } ?>

  ②ReflectionException類

  該類繼承標準類,沒特殊方法和屬性。

  ③ReflectionFunction類

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 <?php class ReflectionFunction implements Reflector { final private __clone() public object __construct(string name) public string __toString() public static string export() //匯出該函數的詳細資料 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 mixed invoke(mixed* args) //調用該函數,通過參數列表傳參數 public mixed invokeArgs(array args) //調用該函數,通過數組傳參數 public bool returnsReference() //測試該函數是否返回引用 public ReflectionParameter[] getParameters() //取得該方法所需的參數,傳回值為對象數組 public int getNumberOfParameters() //取得該方法所需的參數個數 public int getNumberOfRequiredParameters() //取得該方法所需的參數個數 } ?>

  ④ReflectionParameter類:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?php class ReflectionParameter implements Reflector { final private __clone() public object __construct(string name) public string __toString() public static string export() //匯出該參數的詳細資料 public string getName() //取得參數名 public bool isPassedByReference() //測試該參數是否通過引用傳遞參數 public ReflectionClass getClass() //若該參數為對象,返回該對象的類名 public bool isArray() //測試該參數是否為數群組類型 public bool allowsNull() //測試該參數是否允許為空白 public bool isOptional() //測試該參數是否為可選的,當有預設參數時可選 public bool isDefaultValueAvailable() //測試該參數是否為預設參數 public mixed getDefaultValue() //取得該參數的預設值 } ?>

  ⑤ReflectionClass類:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 <?php class ReflectionClass implements Reflector { final private __clone() public object __construct(string name) public string __toString() public static string export() //匯出該類的詳細資料 public string getName() //取得類名或介面名 public bool isInternal() //測試該類是否為系統內部類 public bool isUserDefined() //測試該類是否為使用者自訂類 public bool isInstantiable() //測試該類是否被執行個體化過 public bool hasConstant(string name) //測試該類是否有特定的常量 public bool hasMethod(string name) //測試該類是否有特定的方法 public bool hasProperty(string name) //測試該類是否有特定的屬性 public string getFileName() //取得定義該類的檔案名稱,包括路徑名 public int getStartLine() //取得定義該類的開始行 public int getEndLine() //取得定義該類的結束行 public string getDocComment() //取得該類的注釋 public ReflectionMethod getConstructor() //取得該類的建構函式資訊 public ReflectionMethod getMethod(string name) //取得該類的某個特定的方法資訊 public ReflectionMethod[] getMethods() //取得該類的所有的方法資訊 public ReflectionProperty getProperty(string name) //取得某個特定的屬性資訊 public ReflectionProperty[] getProperties() //取得該類的所有屬性資訊 public array getConstants() //取得該類所有常量資訊 public mixed getConstant(string name) //取得該類特定常量資訊 public ReflectionClass[] getInterfaces() //取得介面類資訊 public bool isInterface() //測試該類是否為介面 public bool isAbstract() //測試該類是否為抽象類別 public bool isFinal() //測試該類是否聲明為final public int getModifiers() //取得該類的修飾符,傳回值類型可能是個資源類型 //通過Reflection::getModifierNames($class->getModifiers())進一步讀取 public bool isInstance(stdclass object) //測試傳入的對象是否為該類的一個執行個體 public stdclass newInstance(mixed* args) //建立該類執行個體 public ReflectionClass getParentClass() //取得父類 public bool isSubclassOf(ReflectionClass class) //測試傳入的類是否為該類的父類 public array getStaticProperties() //取得該類的所有靜態屬性 public mixed getStaticPropertyValue(string name [, mixed default]) //取得該類的靜態屬性值,若private,則不可訪問 public void setStaticPropertyValue(string name, mixed value) //設定該類的靜態屬性值,若private,則不可訪問,有悖封裝原則 public array getDefaultProperties() //取得該類的屬性資訊,不含靜態屬性 public bool isIterateable() public bool implementsInterface(string name) //測試是否實現了某個特定介面 public ReflectionExtension getExtension() public string getExtensionName() } ?>

  ⑥ReflectionMethod類:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <?php class ReflectionMethod extends ReflectionFunction { public __construct(mixed class, string name) public string __toString() public static string export() //匯出該方法的資訊 public mixed invoke(stdclass object, mixed* args) //調用該方法 public mixed invokeArgs(stdclass object, array args) //調用該方法,傳多參數 public bool isFinal() //測試該方法是否為final public bool isAbstract() //測試該方法是否為abstract public bool isPublic() //測試該方法是否為public public bool isPrivate() //測試該方法是否為private public bool isProtected() //測試該方法是否為protected public bool isStatic() //測試該方法是否為static public bool isConstructor() //測試該方法是否為建構函式 public bool isDestructor() //測試該方法是否為解構函式 public int getModifiers() //取得該方法的修飾符 public ReflectionClass getDeclaringClass() //取得該方法所屬的類 // 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類:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?php class ReflectionProperty implements Reflector { final private __clone() public __construct(mixed class, string name) public string __toString() public static string export() //匯出該屬性的詳細資料 public string getName() //取得該屬性名稱 public bool isPublic() //測試該屬性名稱是否為public public bool isPrivate() //測試該屬性名稱是否為private public bool isProtected() //測試該屬性名稱是否為protected public bool isStatic() //測試該屬性名稱是否為static public bool isDefault() public int getModifiers() //取得修飾符 public mixed getValue(stdclass object) //取得該屬性值 public void setValue(stdclass object, mixed value) //設定該屬性值 public ReflectionClass getDeclaringClass() //取得定義該屬性的類 public string getDocComment() //取得該屬性的注釋 } ?>

  ⑧ReflectionExtension類

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php class ReflectionExtension implements Reflector { final private __clone() public __construct(string name) public string __toString() public static string export() //匯出該擴充的所有資訊 public string getName() //取得該擴充的名字 public string getVersion() //取得該擴充的版本 public ReflectionFunction[] getFunctions() //取得該擴充的所有函數 public array getConstants() //取得該擴充的所有常量 public array getINIEntries() //取得與該擴充相關的,在php.ini中的指令資訊 public ReflectionClass[] getClasses() public array getClassNames() }   ?>

  使用例子:

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <?php class Person{ private $_name;   public $age;   public function __construct(){ $this->sex = "male"; }   public function action(){ echo "來自http://www.3lian.net的測試"; } }   $class = new ReflectionClass('Person'); //擷取屬性 foreach($class->getProperties() as $property) { echo $property->getName()."n"; } //擷取方法 print_r($class->getMethods());   $p1 = new Person(); $obj = new ReflectionObject($p1);   //擷取對象和類的屬性 print_r($obj->getProperties());

  很明顯上面代碼中對象和類擷取的屬性是不同的,這是因為對象進行了contruct執行個體化,因此多了sex屬性,PHP Reflection確實能夠擷取很多有用的資訊。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。