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!';
運行結果: