我正在创建一个非常简单的Web服务,我不想打扰一些框架来实现它。
我正在尝试这样做,所以我可以通过使用类似
的字符串来调用类上的方法$myMethod = "test";
$args = array("arg1", "arg2");
$myMethod();
问题是每种方法可能有不同数量的参数。除了传入一个参数数组之外,有没有办法调用$ myMethod()并像通常的myMethod(arg1,arg2)一样传入参数?
答案 0 :(得分:6)
使用call_user_func_array:http://php.net/manual/en/function.call-user-func-array.php
答案 1 :(得分:2)
执行此操作的唯一方法是使用call_user_func_array()
,但此功能非常慢。
你知道他们告诉你什么不在PHP中使用eval()
吗?想象call_user_*
函数就像eval()
一样 - 它们非常慢。
<强>解决方案强>
1)你可以盲目地传递参数:
$mtd = 'test';
$args = array('a','b');
array_pad($args, 8, null);
return $mtd($args[0],$args[1],$args[2],$args[3],$args[4],$args[5],$args[6],$args[7]);
2)您可以对参数进行计数,并为每个参数调用不同的硬编码函数:
$mtd = 'test';
$args = array('a','b');
switch(count($args)){
case 0: return $mtd();
case 1: return $mtd($args[0]);
case 2: return $mtd($args[0],$args[1]);
case 3: return $mtd($args[0],$args[1],$args[2]);
case 4: return $mtd($args[0],$args[1],$args[2],$args[3]);
case 5: return $mtd($args[0],$args[1],$args[2],$args[3],$args[4]);
default: return call_user_func_array($mtd, $args); // slow, but safe
}
3)最后,你可以做同样的事情Drupal解决这个问题;生成并缓存PHP代码。生成的代码被硬编码以处理特定数量的参数,但清除缓存将使其根据需要增加/减少参数计数。另外,这是快速的方式。
答案 2 :(得分:1)
另外,为了帮助您掌握可变数量的参数,请参阅func_get_args()
function mysomething() {
$args = func_get_args();
print_r( $args );
}
因此,您可以将可变数量的参数从函数移动到函数。