[PHP]利用反射(Reflection)分析Class資訊
有時候為了找出Class中的變數或是方法
最常用的方式就是直接去看原始碼
但如果PHP被加密過了,或是其他種種原因無法看到原始碼
這時候PHP的反射功能就可以幫你分析出Class中有什麼樣的變數或方法
甚至連私有變數內容都可以取出來,直接看原始碼吧
class ClassA{
private $id = 1;
private $name = 'Michael Chan';
private function changeName($name){
$this -> name = $name;
}
}
以上是一個簡單的Class,兩個私有變數、一個私有方法
那麼就先抓出變數吧
function resolveClassVarible($class){
$result = array();
$reflect = new ReflectionClass($class);
foreach ($reflect -> getProperties() As $property){
//設定解除保護,否則無法取出內容
$property -> setAccessible(true);
$result[$property -> getName()] =
$property -> getValue($class);
}
}
print_r(resolveClassVarible(new ClassA()));
/*
Array(
[id] => 1
[name] => Michael Chan
)
*/
變數就這樣被取出來了
function resolveClassMethod($class){
$result = array();
$reflect = new ReflectionClass($class);
foreach ($reflect -> getMethods() As $property){
$params = array();
foreach ($property -> getParameters() As $param){
$params[] = $param -> getName();
}
$result[$property -> getName()] = $params;
}
}
print_r(resolveClassMethod(new ClassA()));
/*
array(
[changeName] => array
(
[0] => name
)
)
*/
不困難吧!!不只在PHP中,其他語言比如Java也有同樣的功能
相信學會了之後拿到別人已經包裝過的檔案也可以馬上分析出來
但數量龐大的時候要注意效能問題