我正在创建一个非常简单的web服务,我不想用一些框架来实现它
我正试图通过使用类似的字符串来调用类上的方法
$myMethod = "test";
$args = array("arg1", "arg2");
$myMethod();
问题是每个方法可能有不同数量的参数。除了只传递一个参数数组之外,还有没有一种方法可以像通常的myMethod(arg1,arg2)那样调用$myMethod()并传递参数?
使用call_user_func_array:http://php.net/manual/en/function.call-user-func-array.php
实现这一点的唯一方法是使用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代码。生成的代码经过硬编码,可以处理特定数量的参数,但清除缓存将使其根据需要增加/减少参数数。另外,这是最快的方式。
此外,为了帮助您使用可变数量的参数,请参阅func_get_args()
function mysomething() {
$args = func_get_args();
print_r( $args );
}
因此,您可以将可变数量的参数从一个函数移动到另一个函数。