首頁 php教程 PHP开发 PHP的反射類別ReflectionClass、ReflectionMethod使用實例

PHP的反射類別ReflectionClass、ReflectionMethod使用實例

Dec 23, 2016 pm 12:56 PM
反射

PHP5 具有完整的反射API,增加對類別、介面、函數、方法和擴充進行反向工程的能力。

反射是什麼?

它是指在PHP運行狀態中,擴展分析PHP程序,導出或提取出關於類、方法、屬性、參數等的詳細信息,包括註釋。這種動態取得的資訊以及動態呼叫物件的方法的功能稱為反射API。反射是操縱物件導向範式中元模型的API,其功能十分強大,可幫助我們建立複雜,可擴展的應用。

其用途如:自動載入插件,自動產生文檔,甚至可用來擴充PHP語言。

PHP反射api由若干類別組成,可協助我們用來存取程式的元資料或同相關的註解互動。借助反射我們可以取得諸如類別實作了那些方法,創建一個類別的實例(不同於用new創建),呼叫一個方法(也不同於常規呼叫),傳遞參數,動態呼叫類別的靜態方法。
反射api是PHP內建的OOP技術擴展,包括一些類,異常和接口,綜合使用他們可用來幫助我們分析其它類,接口,方法,屬性,方法和擴展。這些OOP擴展稱為反射。

平常我們用的比較多的是ReflectionClass類和ReflectionMethod類,例如:

<?php
class Person {
 /**
  * For the sake of demonstration, we"re setting this private
  */
 private $_allowDynamicAttributes = false;
 /**
  * type=primary_autoincrement
  */
 protected $id = 0;
 /**
  * type=varchar length=255 null
  */
 protected $name;
 /**
  * type=text null
  */
 protected $biography;
 public function getId() {
  return $this->id;
 }
 public function setId($v) {
  $this->id = $v;
 }
 public function getName() {
  return $this->name;
 }
 public function setName($v) {
  $this->name = $v;
 }
 public function getBiography() {
  return $this->biography;
 }
 public function setBiography($v) {
  $this->biography = $v;
 }
}
登入後複製

一、透過ReflectionClass,我們可以得到Person類的以下資訊:

1.常量Contants
2.屬性 Names3.方法Method Names靜態
4.屬性Static Properties
5.命名空間Namespace
6.Person類別是否為final或abstract
7.Person類別是否有某個方法

接下來反射它,只要把類別名稱"Person"傳遞給ReflectionClass就可以了:

$class = new ReflectionClass(&#39;Person&#39;); // 建立 Person这个类的反射类  
$instance  = $class->newInstanceArgs($args); // 相当于实例化Person 类
登入後複製

1)取得屬性(Properties):

$properties = $class->getProperties();
foreach ($properties as $property) {
 echo $property->getName() . "\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography
登入後複製

預設情況下,ReflectionClass會取得所有的屬性,private 和protected的也可以。如果只想取得到private屬性,就要額外傳個參數:

$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);
登入後複製

可用參數清單:

ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE
登入後複製

透過$property->getName()可以得到屬性名稱。


2)取得註解:

透過getDocComment可以得到寫給property的註解。

foreach ($properties as $property) {
 if ($property->isProtected()) {
  $docblock = $property->getDocComment();
  preg_match(&#39;/ type\=([a-z_]*) /&#39;, $property->getDocComment(), $matches);
  echo $matches[1] . "\n";
 }
}
// Output:
// primary_autoincrement
// varchar
// text
登入後複製

3)取得類別的方法

getMethods()       来获取到类的所有methods。
hasMethod(string)  是否存在某个方法
getMethod(string)  获取方法
登入後複製

4)執行類別的方法:

$instance->getName(); // 执行Person 里的方法getName
// 或者:
$method = $class->getmethod(&#39;getName&#39;); // 获取Person 类中的getName方法
$method->invoke($instance);    // 执行getName 方法
// 或者:
$method = $class->getmethod(&#39;setName&#39;); // 获取Person 类中的setName方法
$method->invokeArgs($instance, array(&#39;snsgou.com&#39;));
登入後複製

二、透過ReflectionMethod,我們可以得到Person類別的某個方法的資訊:

1.是否「publicted」、「protected ”、“private” 、“static”類型

2.方法的參數列表
3.方法的參數個數
4.反調用類別的方法

// 执行detail方法
$method = new ReflectionMethod(&#39;Person&#39;, &#39;test&#39;);
if ($method->isPublic() && !$method->isStatic()) {
 echo &#39;Action is right&#39;;
}
echo $method->getNumberOfParameters(); // 参数个数
echo $method->getParameters(); // 参数对象数组
登入後複製
更多PHP的反射類別ReflectionClass、ReflectionMethod使用實例相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中介面和抽象類別的反射機制實現 Java 中介面和抽象類別的反射機制實現 May 02, 2024 pm 05:18 PM

反射機制允許程式在執行時間取得和修改類別訊息,它可用於實作介面和抽象類別的反射:介面的反射:透過Class.forName()取得介面反射對象,存取其元資料(名稱、方法和欄位) 。抽象類別的反射:與介面類似,可取得抽象類別的反射對象,存取其元資料以及非抽象方法。實戰案例:反射機制可用於實作動態代理,透過動態建立代理類別在執行時攔截對介面方法的呼叫。

golang 如何使用反射存取私有欄位和方法 golang 如何使用反射存取私有欄位和方法 May 03, 2024 pm 12:15 PM

Go語言中可以使用反射來存取私有欄位和方法:存取私有欄位:透過reflect.ValueOf()取得值的反射值,再使用FieldByName()取得欄位的反射值,並呼叫String()方法列印欄位的值。呼叫私有方法:同樣透過reflect.ValueOf()取得值的反射值,再使用MethodByName()取得方法的反射值,最後呼叫Call()方法執行方法。實戰案例:透過反射修改私有欄位值和呼叫私有方法,實現物件的控制和單元測試覆寫。

解決Java反射異常(ReflectiveOperationException)的方法 解決Java反射異常(ReflectiveOperationException)的方法 Aug 26, 2023 am 09:55 AM

解決Java反射異常(ReflectiveOperationException)的方法在Java開發中,反射(Reflection)是一種強大的機制,它允許程式在執行時間動態地取得和操作類別、物件、方法和屬性等。透過反射,我們可以實現一些靈活的功能,例如動態創建物件、呼叫私有方法、取得類別的註解等。然而,使用反射也會帶來一些潛在的風險和問題,其中之一就是反射異常(

golang 反射的安全性考量和最佳方案 golang 反射的安全性考量和最佳方案 May 04, 2024 pm 04:48 PM

反射在Go中提供類型檢查和修改功能,但存在安全隱患,包括任意程式碼執行、類型偽造和資料外洩。最佳方案包括限制反射權限、操作、使用白名單或黑名單、驗證輸入以及使用安全工具。實務中,反射可安全用於檢查類型資訊。

golang 如何使用反射動態修改變數值 golang 如何使用反射動態修改變數值 May 02, 2024 am 11:09 AM

Go語言反射允許在運行時操控變數值,包括修改布林值、整數、浮點數和字串。透過取得變數的Value,可以呼叫SetBool、SetInt、SetFloat和SetString方法來進行修改。例如,可以解析JSON字串為結構體,然後使用反射修改結構體欄位的值。需要注意,反射操作較慢,且無法修改不可修改字段,修改結構體字段值時可能不會自動更新相關字段。

Golang反射介紹及應用場景分析 Golang反射介紹及應用場景分析 Apr 03, 2024 pm 01:45 PM

Go語言中的反射功能可讓程式在執行時間檢查和修改類型的結構。透過使用Type、Value和reflect.Kind,我們可以取得物件的類型資訊、欄位值和方法,還可以建立和修改物件。具體的操作方法包括:檢查類型(TypeOf())、取得欄位值(ValueOf()、FieldByName())、修改欄位值(Set())、建立物件(New())。

golang函數利用反射實現面向切面的編程 golang函數利用反射實現面向切面的編程 Apr 25, 2024 pm 05:48 PM

答案:是的,Go語言中的反射可以實現面向切面的程式設計。詳細描述:反射允許程式在運行時修改和檢查自己的類型和值。透過反射,我們可以為程式碼創建全域切面,在函數執行前、後觸發。這使我們能夠輕鬆新增日誌記錄等功能,而無需修改現有程式碼。反射提供了程式碼解耦、可擴展性以及靈活控制的優點,從而提高了應用程式的可維護性和可重用性。

golang 如何使用反射建立新類型 golang 如何使用反射建立新類型 May 01, 2024 am 09:21 AM

利用反射,Go允許建立新類型,1.使用reflect.TypeOf()取得現有類型的reflect.Type值;2.使用reflect.New()建立新類型的指標值;3.透過*Ptr.Elem( )存取實際值;4.反射還可以根據字串動態建立新類型,用於建立靈活且動態的程式。

See all articles