PHP通过带参数的字符串调用方法的最佳方法?

时间:2012-04-03 14:24:30

标签: php web-services

我正在创建一个非常简单的Web服务,我不想打扰一些框架来实现它。

我正在尝试这样做,所以我可以通过使用类似

的字符串来调用类上的方法
$myMethod = "test";
$args = array("arg1", "arg2");
$myMethod();

问题是每种方法可能有不同数量的参数。除了传入一个参数数组之外,有没有办法调用$ myMethod()并像通常的myMethod(arg1,arg2)一样传入参数?

3 个答案:

答案 0 :(得分:6)

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

因此,您可以将可变数量的参数从函数移动到函数。