日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

下面給大家解析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) 帶參數執行方法


實例演示

<?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";
    }
}
// 執行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 基于反射實現鉤子
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定