简单记录下通过反射来获取某方法的参数,然后利用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. SharpNodeSettings项目,可配置的数据采集,统一的工业数据网关,OPC UA服务器开发,PLC数据发布到自身内存,redis,opc ua,以及数据可视化开发

    本项目隶属于 HslCommunication 项目的SDK套件,如果不清楚HslCommunication组件的话,可以先了解那个项目,源代码地址:https://github.com/dathli ...

  2. 6-1 Deque(25 分)Data Structures and Algorithms (English)

    A "deque" is a data structure consisting of a list of items, on which the following operat ...

  3. 使用defined和require引入js

    define(function(require, exports, module) { var ceshiTwo = { dataCeshi:[1,2,3,4,5], arrCeshi:functio ...

  4. PHP如何清除COOKIE?PHP无法删除COOKIE?设置COOKIE有效期、COOKIE过期

    cookie和session的区别? http://www.cnblogs.com/phphuaibei/archive/2011/11/15/2250082.html PHP如何清除COOKIE?P ...

  5. phpmyadmin不允许一个表创建多个主键的解决办法

    在phpmyadmin中执行建表语句 CREATE TABLE `user3` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(2 ...

  6. open_input_file函数调用结构图(转)

    open_input_file函数调用结构图(有些重复的函数调用就略掉了,大致是按流程往下的). 函数大致说明: AVFormatContext *avformat_alloc_context(voi ...

  7. bzoj 2007 [Noi2010]海拔——最小割转最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...

  8. spring 配置文件中使用properties文件 配置

    配置Bean载入properties文件: <bean id="propertyPlaceholderConfigurer" class="org.springfr ...

  9. Python 迭代对象、迭代器、生成器

    原文出处: liuzhijun 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文 ...

  10. debian7配置iptables

    vim /etc/iptables.rule 文件内容如下 *filter # Allows all loopback (lo0) traffic and drop all traffic to / ...