将可变长度数组传递给类方法

时间:2013-03-21 16:10:52

标签: php arrays methods

我正在尝试为自己创建一个小的MVC框架,并使用类似于http://www.example.com/className/methodName/var1/var2/var3的url结构。我想让它能够适应任何数量的变量。

/var1/var2/var3部分外,我掌握了所有需要的信息。目前我将它放在“/”上的数组爆炸()中,所以:var[0] = "var1",var[1] = "var2",var[2] = "var3"

由于将要调用的方法是未知的,并且每个方法都需要不同数量的参数,我想找出一种方法来传递参数:

$controller->$function($var1, $var2, $var3);

而不是

$controller->$function($var);

我意识到我可以将逗号分隔的变量(如$var1, $var2, $var3)串起来并使用eval()来完成我想要的操作,但我想知道是否有更好的方法来实现它。我宁愿不使用eval(),因为它将使用用户提交的数据。

最糟糕的情况,我想我会尝试在eval之前清理数据,但我仍然想避免它。

另一个潜在的想法是使用foreach()并循环遍历方法调用中的每个元素。但即使这对我来说似乎有些混乱。

另一方面,传递可变数量的参数以在数组中将它们组合在一起并传入单个参数的标准方法是什么?

如果有人知道更优雅的方式,我会非常感激。

2 个答案:

答案 0 :(得分:2)

使用call_user_func_array

call_user_func_array(array($controller, $function), array($var1, $var2...));

答案 1 :(得分:1)

@ Dogbert的答案将补充我即将建议的内容。

你可以创建一个不接受任何参数的函数,你可以自由地传递任意数量的参数(或根本没有参数),你只需要使用PHP函数,如:func_get_args(),{{1和} func_num_args()进行操作。

以下示例如下:

func_get_arg(int arg_index)

您可以通过以下方式调用此函数:

function syncOrderRelation(){
    $num_arguments = func_num_args();
    $arguments = func_get_args();
    #gets all the arguments in the request
    list($userID,$spID,$productID) = $arguments;
    #if you know what you're expecting or
    for($i = 0; $i < $num_arguments; $i++){
            $argument_at_index = func_get_arg($i);
    }
}    

剩下的由你决定......快乐的编码!