解析thinkPHP基于反射实现钩子的方法

发布时间 - 2021-05-26 00:00:00    点击率:

下面由thinkphp框架教程栏目给大家解析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)  带参数执行方法

实例演示

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;
}
相关推荐:最新的10个thinkphp视频教程


# thinkphp  # php  # String  # Array  # Object  # public  # 给大家  # 自定义  # 抛出  # 是否存在  # 如何实现  # 操作方法  # 系统自带  # BlogAction  # test  # function 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何解决hover在ie6中的兼容性问题  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Angular 表单中正确绑定输入值以确保提交与验证正常工作  如何在局域网内绑定自建网站域名?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  如何挑选高效建站主机与优质域名?  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  网站建设整体流程解析,建站其实很容易!  如何快速选择适合个人网站的云服务器配置?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何在Windows服务器上快速搭建网站?  HTML 中动态设置元素 name 属性的正确语法详解  如何用y主机助手快速搭建网站?  Python函数文档自动校验_规范解析【教程】  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  jquery插件bootstrapValidator表单验证详解  详解vue.js组件化开发实践  音乐网站服务器如何优化API响应速度?  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何注册花生壳免费域名并搭建个人网站?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  EditPlus中的正则表达式 实战(1)  Laravel怎么在Blade中安全地输出原始HTML内容  nginx修改上传文件大小限制的方法  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  zabbix利用python脚本发送报警邮件的方法  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  php 三元运算符实例详细介绍  微信小程序 配置文件详细介绍  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何快速生成可下载的建站源码工具?  大连网站制作公司哪家好一点,大连买房网站哪个好?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  大型企业网站制作流程,做网站需要注册公司吗?  清除minerd进程的简单方法