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

时间:2011-01-23 03:07:38

标签: php reflection parameters

我需要使用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?

由于

2 个答案:

答案 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");