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


PHP best way to call method by string with arguments?

我正在创建一个非常简单的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 );
}

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