1

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

我有我需要的所有信息,除了/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() ,因为它将使用用户提交的数据。

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

我的另一个潜在想法是使用 foreach() 并遍历方法调用中的每个元素。但即使这样对我来说也有点乱。

附带说明一下,传递可变数量的参数以将它们组合在一个数组中并传入单个参数的标准方法是什么?

如果有人知道更优雅的方法来做到这一点,我将不胜感激。

4

2 回答 2

2

使用call_user_func_array

call_user_func_array(array($controller, $function), array($var1, $var2...));
于 2013-03-21T16:13:49.080 回答
1

@Dogbert 的回答将补充我将要提出的建议。

您可以创建一个不接受参数的函数,并且您可以自由传递尽可能多的参数(或根本不传递参数),您只需要使用 PHP 函数,如: func_get_args()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);
    }
}    

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

syncOrderRelation();
syncOrderRelation($var1,$var2,var3);
syncOrderRelation($var1);
#or you could call it as @Dogbert suggested since the function will accept whatever
#arguments you supply    

剩下的就看你了……祝你编码愉快!

于 2013-03-21T16:51:28.673 回答