Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP通过带参数的字符串调用方法的最佳方法?_Php_Web Services - Fatal编程技术网

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

PHP通过带参数的字符串调用方法的最佳方法?,php,web-services,Php,Web Services,我正在创建一个非常简单的web服务,我不想麻烦用一些框架来实现它 我正在尝试这样做,以便通过使用类似 $myMethod = "test"; $args = array("arg1", "arg2"); $myMethod(); 问题是每个方法可能有不同数量的参数。除了只传递一个参数数组之外,还有没有一种方法可以调用$myMethod()并像通常的myMethod(arg1,arg2)一样传递参数?使用call\u user\u func\u数组:另外,为了帮助您使用不同数量的参数,请参见fu

我正在创建一个非常简单的web服务,我不想麻烦用一些框架来实现它

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

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

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

使用call\u user\u func\u数组:

另外,为了帮助您使用不同数量的参数,请参见
func\u get\u args()


因此,您可以在函数之间移动不同数量的参数。

唯一的方法是使用
调用用户函数数组()
,但此函数非常慢

你知道他们是怎么告诉你不要在PHP中使用
eval()
的吗?想想
call\u 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\u get\u args(myFunctionIdentifier)
并传入函数名,以便在调用函数时知道其参数列表。我猜这会打破PHP的编程方法overloading@Walt可以,PHP支持反射;使用
ReflectionFunction
类。
$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
}