激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - thinkPHP基于反射實現(xiàn)鉤子的方法分析

thinkPHP基于反射實現(xiàn)鉤子的方法分析

2021-07-18 17:59雪山飛豬 PHP教程

這篇文章主要介紹了thinkPHP基于反射實現(xiàn)鉤子的方法,結(jié)合實例形式分析了php基于系統(tǒng)自帶的ReflectionClass、ReflectionMethod 類與函數(shù)實現(xiàn)鉤子功能的相關(guān)操作技巧,需要的朋友可以參考下

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

ThinkPHP框架的控制器模塊是如何實現(xiàn) 前控制器、后控制器,及如何執(zhí)行帶參數(shù)的方法?

PHP系統(tǒng)自帶的 ReflectionClass、ReflectionMethod 類,可以反射用戶自定義類的中屬性,方法的權(quán)限和參數(shù)等信息,通過這些信息可以準確的控制方法的執(zhí)行。

ReflectionClass

主要用的方法:

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

ReflectionMethod

主要方法:

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

實例演示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
class 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";
  }
}
// 執(zhí)行detail方法
$method = new ReflectionMethod('BlogAction', 'detail');
$instance = new BlogAction();
// 進行權(quán)限判斷
if ($method->isPublic()) {
  $class = new ReflectionClass('BlogAction');
  // 執(zhí)行前置方法
  if ($class->hasMethod('_before_detail')) {
    $beforeMethod = $class->getMethod('_before_detail');
    if ($beforeMethod->isPublic()) {
      $beforeMethod->invoke($instance);
    }
  }
  $method->invoke(new BlogAction);
  // 執(zhí)行后置方法
  if ($class->hasMethod('_after_detail')) {
    $beforeMethod = $class->getMethod('_after_detail');
    if ($beforeMethod->isPublic()) {
      $beforeMethod->invoke($instance);
    }
  }
}
// 執(zhí)行帶參數(shù)的方法
$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!';
}

另一段代碼參考

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * 執(zhí)行App控制器
 */
public function execApp() {
  // 創(chuàng)建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();
  // 獲取當(dāng)前操作名
  $action = ACTION_NAME;
  // 執(zhí)行當(dāng)前操作
  //call_user_func(array(&$controller, $action)); // 其實吧,用這個函數(shù)足夠啦!!!
  try {
    $methodInfo = new \ReflectionMethod($namespaceClassName, $action);
    if ($methodInfo->isPublic() && !$methodInfo->isStatic()) {
      $methodInfo->invoke($controller);
    } else { // 操作方法不是public類型,拋出異常
      throw new \ReflectionException();
    }
  } catch (\ReflectionException $e) {
    // 方法調(diào)用發(fā)生異常后,引導(dǎo)到__call方法處理
    $methodInfo = new \ReflectionMethod($namespaceClassName, '__call');
    $methodInfo->invokeArgs($controller, array($action, ''));
  }
  return;
}

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

原文鏈接:http://www.cnblogs.com/chenqionghe/p/4494143.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产精品av久久久久久网址 | 亚洲va久久久噜噜噜久牛牛影视 | 亚洲一区二区三区视频 | 色人久久 | 国产又粗又爽又深的免费视频 | 青青草好吊色 | 国产免费传媒av片在线 | 99亚洲视频 | 欧美激情视频一区二区免费 | 亚洲电影免费观看国语版 | 久色精品视频 | 亚洲卡通动漫在线观看 | 欧美一区二区三区免费不卡 | 成人免费毛片在线观看 | www.com香蕉| 69性欧美高清影院 | 肉文女配h | 日日狠狠久久偷偷四色综合免费 | www.理论片 | 国产一级毛片视频在线! | 欧美日韩免费在线观看视频 | 久久欧美亚洲另类专区91大神 | 九九热精品在线视频 | 久久6国产 | 久久精品黄 | 欧美国产一区二区三区 | 成人免费网视频 | 黄污视频在线看 | 91一区二区在线观看 | 欧美一级淫片免费视频1 | 99re66热这里只有精品8 | 7777在线视频免费播放 | 欧美91看片特黄aaaa | 国产一区二区三区撒尿在线 | 亚洲国产在 | 毛片免费在线观看 | 成年免费大片黄在线观看岛国 | 有兽焉免费动画 | 黄色特级视频 | 嫩草91在线 | 91av在线影院|