[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也有同樣的功能

相信學會了之後拿到別人已經包裝過的檔案也可以馬上分析出來

但數量龐大的時候要注意效能問題