简单记录下通过反射来获取某方法的参数,然后利用php内置函数类执行此方法

  一个简单的test类

 class test
{
//2个参数默认值
public function b($name='lemon',$age,$city='wuhan')
{
echo '<pre>';
8 print_r(func_get_args());
}
}

  要传入的参数

 $params = [
'name'=>'zc',
'age'=>25
];

  通过反射类来获取方法来合并参数

 $args = $actionParams = $missing = [];

 $method = new \ReflectionMethod('test', 'b');
foreach ($method->getParameters() as $param){ $name = $param->getName();//获取参数名
//$params 参数存在于 传入的参数之中
if (array_key_exists($name,$params)) { //有传参数, 按传入的参数
//反射方法 测试该参数是否为数组类型
if ($param->isArray()){
$args[] = $actionParams[$name] = (array) $params[$name];
} elseif(!is_array($params[$name])) { //参数不是数组类型 如 name = lemon
$args[] = $actionParams[$name] = $params[$name];
} else {
throw new Exception('error');
}
unset($params[$name]);
} elseif ($param->isDefaultValueAvailable()) { //没有传参数, 检测时候参数有默认值
//getDefaultValue 获取参数默认值
$args[] = $actionParams[$name] = $param->getDefaultValue();
} else {
$missing[] = $name;
break;
}
} if (!empty($missing)){
throw new Exception('missing parmters');
}

  执行方法

 $handler = [new test(),'b'];
if (is_callable($handler)) {
call_user_func_array($handler,$args);
}  

  最后打印得到数组如下,和预想一样

Array
(
[0] => zc
[1] => 25
[2] => wuhan
)

php通过反射执行某方法的更多相关文章

  1. C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. 【Java】利用反射执行Spring容器Bean指定的方法,支持多种参数自动调用

    目录 使用情景 目的 实现方式 前提: 思路 核心类 测试方法 源码分享 使用情景 将定时任务录入数据库(这样做的好处是定时任务可视化,也可以动态修改各个任务的执行时间),通过反射执行对应的方法: 配 ...

  3. 反射中的一个问题点:利用Method执行main方法特殊的地方

    利用Method执行main方法 问题: 启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个m ...

  4. 在动作类上加上SkipValidation 在反射时候会获取到该反射信息 就不会执行validate方法

    在动作类上加上SkipValidation 在反射时候会获取到该反射信息 就不会执行validate方法

  5. 通过反射执行get、set方法

    Class clazz = sourceObj.getClass(); 1.获取所有属性 BeanInfo beanInfo = Introspector.getBeanInfo(clazz); Pr ...

  6. 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)

    反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法)   创建Delegate (1).Delegate.CreateDelegate(Type, ...

  7. Python 面向对象(四) 反射及其魔术方法

    反射 reflection 也有人称之为自省 作用: 运行时获取.添加对象的类型定义信息,包括类 内建方法: getattr(object, name[, default])   返回object对象 ...

  8. spring初始化bean时执行某些方法完成特定的初始化操作

    在项目中经常会在容器启动时,完成特定的初始化操作,如资源文件的加载等. 一 实现的方式有三种: 1.使用@PostConstruct注解,该注解作用于void方法上 2.在配置文件中配置init-me ...

  9. thinkphp如何利用反射实现钩子方法

    ThinkPHP框架的控制器模块是如何实现 前控制器.后控制器,及如何执行带参数的方法? PHP系统自带的 ReflectionClass.ReflectionMethod 类,可以反射用户自定义类的 ...

随机推荐

  1. C++的explicit关键字

    C++程序员对于explicit这个关键字其实不是很熟悉,至少我是如此:原因在于其使用范围不大,而且作用也没有那么大. 但是这不是说明我们的程序中不需要这个关键字,按Google的C++编程规范和Ef ...

  2. RabbitMQ部署

    操作步骤: 安装依赖文件 -->yum install ncurses-devel 进入opt目录创建rabbitmq目录 -->cd /opt -->mkdir rabbitMQ ...

  3. test20181020 B君的第二题

    题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...

  4. poj3311 经典tsp问题

    题目的大概意思就是一个人到一些城市送披萨,要求找到一条路径可以遍历每个城市后返回出发点,而且路径距离最短.最后输出最短距离就可以. 注意:每个城市可反复訪问多次. 因为题中明白说了两个城市间的直接可达 ...

  5. C#调用OCR组件识别图片文字

    图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇总一下(C#实现),方便需要的朋友查阅,也给自己做个记号. 图片识别的用途:很多人用它去破解网站的验证码,用于达到自动刷票或者是批量 ...

  6. TortoiseSVN 结合使用哪个问题跟踪系统比较好?TRAC?REDMINE?都有什么优缺点?

    TortoiseSVN 结合使用哪个问题跟踪系统比较好?TRAC?REDMINE?都有什么优缺点? -------------------------------------------------- ...

  7. Hive之 hive架构

    Hive架构图 主要分为以下几个部分: 用户接口,包括 命令行CLI,Client,Web界面WUI,JDBC/ODBC接口等 中间件:包括thrift接口和JDBC/ODBC的服务端,用于整合Hiv ...

  8. 国内yum源的安装(163,阿里云,epel)

    ----阿里云镜像源 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的 ...

  9. 02 - Unit08:搜索笔记功能、搜索分页、处理插入数据库乱码问题

    搜索笔记功能 按键监听事件 $("#search_note").keydown(function(event){ var code=event.keyCode; if(code== ...

  10. VS2013编译64位OpenSSL(附32位)

    安装ActivePerl 这个没什么好说的,直接运行msi即可. 编译OpenSSL 1.使用Visual Studio Tool中的“VS2013 x64 本机工具命令提示”来打开控制台:也可以打开 ...