PHP反射和invokeArgs():强制参数使用其默认值
我需要使用反射API调用一个函数。该函数有可选参数,我需要调用它,只提供其中的一些参数 例如,我有以下功能:PHP反射和invokeArgs():强制参数使用其默认值,php,reflection,parameters,Php,Reflection,Parameters,我需要使用反射API调用一个函数。该函数有可选参数,我需要调用它,只提供其中的一些参数 例如,我有以下功能: public function doSomething($firstParam, $secondParam = "default", $thirdParam = "default) 我正在使用invokeArgs()调用doSomething(),传递一个表示参数的值数组,忽略将值设置为可选的$secondParam: $parameters = array("firstParam"=
public function doSomething($firstParam, $secondParam = "default", $thirdParam = "default)
我正在使用invokeArgs()
调用doSomething()
,传递一个表示参数的值数组,忽略将值设置为可选的$secondParam
:
$parameters = array("firstParam"=>"value", "thirdParam"=>"thirdValue");
$reflectedDoSomething->invokeArgs($instance, $parameters);
这里发生的情况是,invokeArgs()
调用一行中设置其参数的方法,而不跳过现在值为“thirdValue”的$secondParam
,并省略$thirdParam
。这在逻辑上是正确的。该方法的调用类似于doSomething(“value”,“thirdValue”)
这里我要做的是强制$secondParam
使用其默认值。在$parameters
数组中设置“secondParam”=>null
不是解决方案,因为null
是一个值
可以使用反射吗
谢谢不设置关联名称
secondParam
,而是将null
作为第二个参数
$parameters = array("firstParam"=>"value", null, "thirdParam"=>"thirdValue");
请参阅对的第一条评论
因此,只需通过一个简单的算法运行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);