thinkphp 控制器調度詳解-ReflectionClass,ReflectionMethod

 1.如何經過地址欄參數來獲得模塊名稱和控制器名稱(即便在有路由和開了重寫模塊的狀況下) php

            在以前的博文中已經有了比較詳細的說明:http://my.oschina.net/u/1178986/blog/201206003 spa


  2.tp是如何實現前置,後置方法功能模塊,和如何執行帶參數的方法?.net

            php系統自帶的 ReflectionClass,ReflectionMethod 類,能夠反射用戶自定義類的中屬性,方法的權限和參數等信息,經過這些信息能夠準確的控制方法的執行 
code

             ReflectionClass:  詳情
blog

                                主要用的方法:  hasMethod(string)  是否存在某個方法
路由

                                                      getMethod(string)   獲取方法
get

             ReflectionMethod : 詳情string

                                主要方法:  getNumberOfParameters()  獲取參數個數io

                                                getParamters()  獲取參數信息function

   3.代碼演示

             

<?php	
class IndexAction{
	public function index(){
			echo 'index'."\r\n";
	}
	public function test($year=2012,$month=2,$day=21){
		 echo $year.'--------'.$month.'-----------'.$day."\r\n";
	}
	public function _before_index(){
			echo __FUNCTION__."\r\n";
	}
	public function _after_index(){
			echo __FUNCTION__."\r\n";
	}
}

//執行index方法
$method = new ReflectionMethod('IndexAction','index');
//進行權限判斷
if($method->isPublic()){
	$class = new ReflectionClass('IndexAction');
	//執行前置方法
	if($class->hasMethod('_before_index')){
		$beforeMethod = $class->getMethod('_before_index');
		if($beforeMethod->isPublic()){
			$beforeMethod->invoke(new IndexAction);
		}
	}

	$method->invoke(new IndexAction);

	//執行後置方法
	if($class->hasMethod('_after_index')){
		$beforeMethod = $class->getMethod('_after_index');
		if($beforeMethod->isPublic()){
			$beforeMethod->invoke(new IndexAction);
		}
	}
}


//執行帶參數的方法
$method = new ReflectionMethod('IndexAction','test');
$params = $method->getParameters();
foreach($params as $param ){
	$paramName = $param->getName();
	if(isset($_REQUEST[$paramName]))
		$args[] = $_REQUEST[$paramName];
	elseif($param->isDefaultValueAvailable())
		$args[] = $param->getDefaultValue();
}
if(count($args)==$method->getNumberOfParameters())
	$method->invokeArgs(new IndexAction,$args);
else
	echo 'parameters is not match!';

運行結果: 

           

相關文章
相關標籤/搜索