2013-03-21 66 views
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(),因为它将使用用户提交的数据。

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

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

在附注上,是传递可变数量参数的标准方法,将它们组合在一起并传入单个参数?

如果有人知道更优雅的方式来做到这一点,我会非常感激。

回答

2

使用call_user_func_array

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

同意。也值得一看PHP中的重载/魔术方法。具体来说:http://www.php.net/manual/en/language.oop5.overloading.php#object.call – ficuscr 2013-03-21 16:15:13

+2

您是否真的阅读过您链接到的手册页? – 2013-03-21 19:07:27

+0

我已经解决了这个问题,(我认为这是一个错字)。 – 2013-03-21 19:15:45

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  

剩下的就是给你......快乐编码!