什麼是php反射類,顧名思義,可以理解為一個類的映射。
舉個例子:
class fuc { //定義一個類
static function ec() {
echo '我是一個類';
}
}
$class=new ReflectionClass('fuc'); //建立 fuc這個類的反射類
echo $class; //輸出這反射類
Class [ class A ] { @@ F:phpwebmyPHPtest.php 23-30 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [1] { Method [ public method __construct ] { @@ F:phpwebmyPHPtest.php 26 - 29 } } }
$fuc=$class->newInstance(); //相當於實例化 fuc 類
$fuc->ec(); //執行 fuc 裡的方法ec
/*最後輸出:我是一個類*/
其中還有一些更高級的用法
$ec=$class->getmethod('ec'); //獲取fuc 類中的ec方法
$fuc=$class->newInstance(); //實例化
$ec->invoke($fuc); //執行ec 方法
上面的過程很熟悉吧。其實和調用對象的方法類似
只不過這裡是反著來的,方法在前,對象在後
舉例
try{
//如果存在控制器名字的類
if(class_exists($this->getController())) {
//利用反射api構造一個控制器類對應的反射類
$rc = new ReflectionClass($this->getController());
//如果該類實現 了IController接口
if($rc->implementsInterface('IController')) {
//該類擁有解析後的action字符串所指向的方法名
if($rc->hasMethod($this->getAction())) {
//構造一個控制器類的實例
$controller = $rc->newInstance();
//獲取該類$action參數所指向的方法對象
$method = $rc->getMethod($this->getAction());
//反射類方法對象的調用方式:
$method->invoke($controller);
} else {
//以下為可能拋出異常
throw new Exception("Action");
}
} else {
throw new Exception("Interface");
}
} else {
throw new Exception("Controller");
}
}catch(exception $e)
{
echo $e;
}