解析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 (iss
et($_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进程的简单方法


et($_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!';
}