一、介紹
PHP5添加了一項新的功能:Reflection。這個功能使得phper可以reverse-engineer class, interface,function,method and extension。通過PHP代碼,就可以得到某object的所有信息,並且可以和它交互。
反射是什麼?
它是指在PHP運行狀態中,擴展分析PHP程序,導出或提取出關於類、方法、屬性、參數等的詳細信息,包括註釋。這種動態獲取的信息以及動態調用對象的方法的功能稱爲反射API。反射是操縱面向對象範型中元模型的API,其功能十分強大,可幫助我們構建複雜,可擴展的應用。
其用途如:自動加載插件,自動生成文檔,甚至可用來擴充PHP語言。
php反射api由若干類組成,可幫助我們用來訪問程序的元數據或者同相關的註釋交互。藉助反射我們可以獲取諸如類實現了那些方法,創建一個類的實例(不同於用new創建),調用一個方法(也不同於常規調用),傳遞參數,動態調用類的靜態方法。
反射api是php內建的oop技術擴展,包括一些類,異常和接口,綜合使用他們可用來幫助我們分析其它類,接口,方法,屬性,方法和擴展。這些oop擴展被稱爲反射。
通過ReflectionClass,我們可以得到Person類的以下信息:
1)常量 Contants
2)屬性 Property Names
3)方法 Method Names靜態
4)屬性 Static Properties
5)命名空間 Namespace
6)Person類是否爲final或者abstract
2、代碼
2.1 定義一個類 (類裏包含 成員變量、方法、註釋等)。
class Refl
{
public $a = 1;
private $ab = 2;
public static $instance = null;
/**
* A類的abc 方法
* @param $a
* @param $b
* @return string
*/
public function abc($a, $b)
{
return $a . "|" . $b;
}
/**
* type 方法
* @param int $type
* @return int
*/
public function mf($type = 1)
{
return $type;
}
public function emp()
{
return 'emp';
}
}
2.2 測試用例
$obj = new \Refl();
//dump($obj);
$obj2 = new \ReflectionClass($obj); // 建立 A 類的反射類
//dump($obj2);
$instance = $obj2->newInstance(); // 相當於實例化了A 類
//dump($instance);
$methods = $obj2->getMethods(); // 獲取類中的所有方法
//dump($methods);
foreach ($methods as $method) {
// dump($method->getDocComment()); // 獲取方法註釋
}
$properties = $obj2->getProperties(); // 獲取類中的所有屬性
//dump($properties);
// 方法1
//echo $instance->abc(1, 2);
// 方法2
$method = $obj2->getMethod('abc');
//echo $method->invokeArgs($instance, ["1111", 2222]);
// 方法3
$method = $obj2->getMethod('emp');
//echo $method->invoke($instance);
// 判斷某個方法是否是私有的
$method = new \ReflectionMethod($obj, "abc");
if ($method->isPublic()) {
//echo "此方法是公有的";
}
$params = $method->getParameters();
//dump($params); // 獲取方法中的參數
$number = $method->getNumberOfParameters(); // 獲取參數的個數
//dump($number);
ps : 官方文檔 api