PHP 反射和 invokeArgs() : forcing a parameter to use its default value

标签 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 使用其默认值。在 $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/

相关文章:

php - 查找 Html 的哪些部分对 PHP 无效

php - 使用寻路器在 modx revolution 中创建子菜单

Java 反射 : Get concrete type of implemented generic interface

c# - 确定代码是否作为单元测试的一部分运行

scala - 为什么 Option 的 orNull 方法有这个多余的隐式参数?

PHP/MySQL 日期和时间比较(不带秒)

php - 从网站发送 "alert/notification"到手机

java - 自动引用 Android 布局组件

c++ - 从 C 程序调用 C++ DLL 时,当我尝试访问 DLL 中的调用参数指针时它崩溃了

c# - 与参数化插入查询作斗争