简单记录下通过反射来获取某方法的参数,然后利用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. SpringDataJPA最佳实践(一)简介

    在团队中使用SpringDataJPA有一段时间了,也踩过一些坑,这里记录一下学习历程. 1.简介 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架 ...

  2. 我的AOP那点事儿--1

    题记:一段时间以来一直想整理下关于AOP的知识,之前一直停留在会怎么使用AOP,关于AOP的深入点儿的知识就不知所以然了,正好项目上刚好用到需要用AOP实现的功能,所以找个时间统一整理下就很有必要了. ...

  3. 【转】Ubuntu12.04安装YouCompleteMe插件

    原文网址:http://m.blog.csdn.net/blog/unhappypeople/19160243 以前用的都是ctags+omnicomplete+acp的方式,这次换成clang自解析 ...

  4. 移植SDL最新版本(转)

    原文出自:http://blog.csdn.net/flyyang123456789/article/details/17223485 首先 将所要移植的包准备好  有 SDL2-2.0.1.tar. ...

  5. gpio_get_value的定义 (转)

    gpio_get_value等一系列函数,并非Linux标准函数,而是跟硬件相关的. 通常我们说的driver都是跟外围设备相关的,所以需要我们自己开发,但是这次我们说到的gpio是跟soc相关的,其 ...

  6. 使用ntp从时间同步服务器更新centos系统时间的方法

    CentOS系统时间同步的步骤如下: 复制代码 代码如下: cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimentpdate us.pool.ntp ...

  7. Application共享数据

    1.Application与Session的区别 Application对象:实现程序级别的数据共享. Session对象:实现会话级别的数据共享. 当需要整个程序级别的共享信息时,可以使用Appli ...

  8. 判断网络类(获取mac) InternetCheck

    using System; using System.Collections.Generic; using System.Net.NetworkInformation; using System.Ru ...

  9. 转-在Mac OS上搭建Python的开发环境

    在Mac OS上搭建Python的开发环境   本文转载自:http://www.jb51.net/article/76931.htm 一. 安装python mac系统其实自带了一个python的执 ...

  10. Qt添加库文件和头文件目录(QCreator)

    在使用QtCreator开发图像处理程序的时候想加入Opencv库来处理图形,添加头文件,需要编辑工程文件夹下的.pro文件在文件中添加以下内容,即可包含头文件的文件夹: INCLUDEPATH += ...