2013-03-21 62 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  

剩下的就是給你......快樂編碼!