我需要使用Reflection 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
是一个值。
是否可以使用Reflection?
由于
答案 0 :(得分:2)
请参阅the docs for 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);
答案 1 :(得分:1)
如何不设置关联名称secondParam
,而是将null
作为第二个第二个参数。
$parameters = array("firstParam"=>"value", null, "thirdParam"=>"thirdValue");