2012-04-03 35 views
0

我正在创建一个非常简单的Web服务,我不想打扰一些框架来实现它。PHP通过带参数的字符串调用方法的最佳方式是什么?

我试图让它这样我就可以像

$myMethod = "test"; 
$args = array("arg1", "arg2"); 
$myMethod(); 

使用字符串调用一个类的方法的问题是可能存在不同数量的每种方法的参数。除了只传入一个参数数组之外,还有一种方法可以调用$ myMethod()并像通常myMethod(arg1,arg2)那样传递参数?

回答

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代码。生成的代码是硬编码的,可以处理特定数量的参数,但清除缓存将使它根据需要增加/减少参数计数。另外,这是最快捷的方式。

+0

谢谢,当我需要决定call_user_ *东西时,我会考虑这一点 – 2012-04-03 15:18:14

1

而且,只是为了帮助你挥舞可变数量的参数,请参阅func_get_args()

function mysomething() { 
    $args = func_get_args(); 
    print_r($args); 
} 

从而可以移动可变数量的参数从功能发挥作用。

+0

太糟糕了,没有办法调用相同的函数'func_get_args(myFunctionIdentifier);'并传递函数名称,以便您可以在调用它时知道其参数列表。猜猜这会违反PHP的超载方法 – 2012-04-03 15:29:56

+0

@Walt你可以,PHP有Reflection支持;使用'ReflectionFunction'类。 – Christian 2012-04-04 06:32:30