PHP反射和invokeArgs():强制参数使用其默认值

我需要使用反射API调用函数。 该函数有可选参数,我需要调用它提供只是其中的一部分。

例如,我有这样的功能:

public function doSomething($firstParam, $secondParam = "default", $thirdParam = "default)

而我使用invokeArgs()调用doSomething()传递代表省略的参数设定值可选值的数组$secondParam

$parameters = array("firstParam"=>"value", "thirdParam"=>"thirdValue"); $reflectedDoSomething->invokeArgs($instance, $parameters);

这里发生的是, invokeArgs()调用方法设置其连续的参数,而不会产生跳过$secondParam ,现在非常看重“thirdValue”,并省略了$thirdParam 。 这就是逻辑上正确。 该方法被调用像doSomething("value", "thirdValue")

我想在这里做的是迫使$secondParam使用其默认值。 设置"secondParam" => null的在$parameters数组不是一个解决方案,因为null是一个值。

难道不可能性使用反射?

谢谢

--------------解决方案-------------

请参阅有关的文档的第一个评论invokeArgs()

所以,只要通过运行一个简单的算法PARAMS(你可以为这个包裹创建一个功能,如果你想):

$reflection = new ReflectionMethod($obj, $method);

$pass = array();
foreach($reflection->getParameters() as $param) {
/* @var $param ReflectionParameter */
if(isset($args[$param->getName()])) {
$pass[] = $args[$param->getName()];
} else {
$pass[] = $param->getDefaultValue();
}
}
$reflection->invokeArgs($obj, $pass);

如何设置不是联想的名字secondParam ,而是把一个null作为第二个第二个参数。

$parameters = array("firstParam"=>"value", null, "thirdParam"=>"thirdValue");

分类:php 时间:2012-01-01 人气:4
本文关键词: PHP,反思,参数
分享到:

相关文章

  • 类型的反思参数:ID,以确定它是否是一个类或协议 2012-09-10

    我有以下方法: -(void)SomeMethod:(id)classOrProtocol; 它将被称为是这样的: [self someMethod:@protocol(SomeProtocol)]; 要么 [self someMethod:[SomeClass class]]; 在方法体中我需要决定是否| classOrProtocol | 是: 任何类(类)或任何协议(协议)或其他任何 [[classOrProtocol class] isKindOfClass: [Protocol cla

  • 在无法捕获异常 2013-04-10

    跟帖:http://stackoverflow.com/questions/3057822/the-uncatchable-exception-pt-2 我正在写一个自定义绑定引擎; 我的转换器被称为前DataContext设置的目标元素. 这本身是不是一个大问题,因为当DataContext的最终接收值时,它会得到更新. 是什么原因造成的问题是NullReferenceException异常我得到,因为DataContext的是空,似乎并不想被抓住. 尽管我试图在我的价值转换器捕捉到了异常:

  • 净反思:如何调用一个构造函数一个接口放慢参数 2012-05-03

    我想通过调用净反思,需要一个接口作为参数的构造函数. 这个类的代码看起来是这样的: public interface IStringGetter { string GetString( ); } public class Class1 { private IStringGetter _stringGetter; public Class1( IStringGetter stringGetter ) { _stringGetter = stringGetter; } public String G

  • 通过反思可选参数调用方法 2012-06-21

    我碰到的使用C#4.0中使用可选参数另一个问题. 我如何调用一个函数(或者更确切地说,构造,我有ConstructorInfo对象),我知道它不需要任何参数? 这里是我现在使用的代码: type.GetParameterlessConstructor() .Invoke(BindingFlags.OptionalParamBinding | BindingFlags.InvokeMethod | BindingFlags.CreateInstance, null, new object[0],

  • 在参数T-SQL反思 2012-08-16

    是否有可能使用某种反思的参数在T-SQL模块(函数,过程)? procedure x(@foo nvarchar(max),@bar nvarchar(max)) ... set @foo = isnull(@foo,0); set @bar = isnull(@bar,0); 才有可能遍历我的参数,并在循环中设置它们的值? 或者我需要使用SQLCLR这个? --------------解决方案------------- 如果你认为你需要编程一一列举,那么你可能有太多的参数,很多参数! 也许切换

  • 如何使用可变参数和反思工作 2012-11-01

    简单的问题,如何让这段代码的工作? public class T { public static void main(String[] args) throws Exception { new T().m(); } public // as mentioned by Bozho void foo(String... s) { System.err.println(s[0]); } void m() throws Exception { String[] a = new String[]{"hel

  • 反思:法一般的参数和lambda表达式作为参数 2014-02-08

    我真的想不通这一个... 我试图使用反射来实现以下目的: _builder.Entity<Post>().HasKey(p => p.Id); 让我介绍变量... _builder的类型是DbModelBuilder和Post有一个属性Id类型Guid . 在下面的代码, contentType包装了一个System.Type : var config = _builder.GetType() .GetMethod("Entity") .MakeGenericMeth

  • 反思列出返回类型,参数在C#中的特定空间应用 2014-03-19

    我一直工作在一个封装另一个棘手使用的API的API. 我们的目标是为我的API不要求用户通过1触摸任何旧的API)不需要在旧的API类的任何参数和2)不返回旧的API类的任何实例. 是否有一个程序,也许是一个Visual Studio的插件,可以分析我的C#的解决方案,并给我从公开访问的类可公开访问的方法都返回类型的列表,以及所有的这些方法的参数类型? 否则,好像我必须手动完成所有的课程,并查看是否有任何旧的API暴露给用户. 编辑:由于我一直在使用MSTest的进行单元反正已经测试我的API,

  • 如何反思一个可变参数模板模板参数的元数? 2014-05-20

    考虑一个假想元函数arity ,这需要任何元函数作为参数,并返回其实际的参数数量. 下面显而易见的方法是不可能的,因为由名为内模板的模板参数仅本地定义语言标准. template<template<typename... args> class f> struct arity { static constexpr std::size_t value = sizeof...(args); //ERROR: undefined 'args' }; 甚至没有详尽的专业是一个另类,因为模板

  • Silverlight的反思| 与传递的参数GetCurrentMethod 2012-04-28

    我想打印当前的方法调用到Visual Studio输出这样的(包括返回值): public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { Func<object, object> ret = (value) => { #if DEBUG var debug = new StringBuilder(); debug.Append("MyConver

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.686 (s). 10 q(s)