我需要使用 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
使用其默认值。在 $parameters
数组中设置 "secondParam"=> null
并不是解决方案,因为 null
是一个值。
可以使用反射吗?
谢谢
最佳答案
查看 the docs for invokeArgs()
的第一条评论.
因此,只需通过一个简单的算法运行参数(如果您愿意,您可以创建一个函数来包装它):
$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);
关于PHP 反射和 invokeArgs() : forcing a parameter to use its default value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4772071/