国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

thinkPHP基于反射實現鉤子的方法分析

2024-05-05 00:01:13
字體:
來源:轉載
供稿:網友

本文實例講述了thinkPHP基于反射實現鉤子的方法。分享給大家供大家參考,具體如下:

ThinkPHP框架的控制器模塊是如何實現 前控制器、后控制器,及如何執行帶參數的方法?

PHP系統自帶的 ReflectionClass、ReflectionMethod 類,可以反射用戶自定義類的中屬性,方法的權限和參數等信息,通過這些信息可以準確的控制方法的執行。

ReflectionClass:

主要用的方法:

hasMethod(string)  是否存在某個方法
getMethod(string)  獲取方法

ReflectionMethod:

主要方法:

isPublic()    是否為 public 方法
getNumberOfParameters()  獲取參數個數
getParamters()  獲取參數信息
invoke( object $object [, mixed $parameter [, mixed $... ]] ) 執行方法
invokeArgs(object obj, array args)  帶參數執行方法

實例演示

<?phpclass BlogAction {  public function detail() {    echo 'detail' . "/r/n";  }  public function test($year = 2014, $month = 4, $day = 21) {    echo $year . '--' . $month . '--' . $day . "/r/n";  }  public function _before_detail() {    echo __FUNCTION__ . "/r/n";  }  public function _after_detail() {    echo __FUNCTION__ . "/r/n";  }}// 執行detail方法$method = new ReflectionMethod('BlogAction', 'detail');$instance = new BlogAction();// 進行權限判斷if ($method->isPublic()) {  $class = new ReflectionClass('BlogAction');  // 執行前置方法  if ($class->hasMethod('_before_detail')) {    $beforeMethod = $class->getMethod('_before_detail');    if ($beforeMethod->isPublic()) {      $beforeMethod->invoke($instance);    }  }  $method->invoke(new BlogAction);  // 執行后置方法  if ($class->hasMethod('_after_detail')) {    $beforeMethod = $class->getMethod('_after_detail');    if ($beforeMethod->isPublic()) {      $beforeMethod->invoke($instance);    }  }}// 執行帶參數的方法$method = new ReflectionMethod('BlogAction', '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($instance, $args);} else {  echo 'parameters is wrong!';}

另一段代碼參考

/** * 執行App控制器 */public function execApp() {  // 創建action控制器實例  $className = MODULE_NAME . 'Controller';  $namespaceClassName = '//apps//' . APP_NAME . '//controller//' . $className;  load_class($namespaceClassName, false);  if (!class_exists($namespaceClassName)) {    throw new /Exception('Oops! Module not found : ' . $namespaceClassName);  }  $controller = new $namespaceClassName();  // 獲取當前操作名  $action = ACTION_NAME;  // 執行當前操作  //call_user_func(array(&$controller, $action)); // 其實吧,用這個函數足夠啦!!!  try {    $methodInfo = new /ReflectionMethod($namespaceClassName, $action);    if ($methodInfo->isPublic() && !$methodInfo->isStatic()) {      $methodInfo->invoke($controller);    } else { // 操作方法不是public類型,拋出異常      throw new /ReflectionException();    }  } catch (/ReflectionException $e) {    // 方法調用發生異常后,引導到__call方法處理    $methodInfo = new /ReflectionMethod($namespaceClassName, '__call');    $methodInfo->invokeArgs($controller, array($action, ''));  }  return;}

希望本文所述對大家基于ThinkPHP框架的PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 濮阳县| 皮山县| 陈巴尔虎旗| 潜山县| 都昌县| 中方县| 新闻| 资兴市| 陵川县| 大田县| 灵石县| 化隆| 进贤县| 水城县| 仪陇县| 资源县| 海安县| 平昌县| 双牌县| 广丰县| 金门县| 商洛市| 和政县| 睢宁县| 阳江市| 大姚县| 页游| 拉孜县| 洛扎县| 武城县| 山东| 湄潭县| 宁德市| 塘沽区| 古丈县| 屏东县| 南宫市| 大宁县| 张家港市| 新蔡县| 兖州市|