2008-10-11 74 views
2

我正在寫在PHP構造物,其中解析器determins哪個函數動態調用,有點像這樣:使用函數原型動態在PHP

// The definition of what to call 
$function_call_spec = array("prototype" => "myFunction", 
          "parameters" => array("first_par" => "Hello", 
                "second_par" => "World")); 

// Dispatch 
$funcPrototype = $function_call_spec["prototype"]; 
$funcPrototype(); // Here we call function 'myFunction'. 

這是所有罰款和花花公子。但現在下一步,傳遞參數,我不知道是否可能的方式,我想這樣做。它永遠不會停止驚人的我卻什麼腳本語言可以做這些天,所以這裏有雲:

人們可以通過參數來像這樣的功能:

// Here we call function 'myFunction' with the array of parameters. 
$funcPrototype($function_call_spec["parameters"]); 

不過,我要聲明「myFunction的」正常有明確的參數等:

function myFunction($first_par, $second_par) 
{ 

} 

接下來的問題如下 - 有什麼辦法參數通過參數數組循環動態簡單地傳遞給函數?

爲了澄清,我想要做這樣的:

$funcPrototype($function_call_spec["parameters"]["first_par"], 
       $function_call_spec["parameters"]["second_par"] ); 

,因爲這需要我的代碼以靜態知道myFunction的細節,這違背了這個念頭。

相反,我會想這樣做在某種程度上像這樣也許:

// Special magic PHP function which can be used for invoking functions dynamically 
InvokeFunction($funcPrototype, $function_call_spec["parameters"]); 

然後導致myFunction的調用和陣列中的所有參數被傳遞給在原型每個單獨的參數變量。

歡迎任何評論。

問候。

/R

PS:代碼沒有在這個崗位已經過測試,錯別字等

回答

10

你應該使用call_user_func_array它可以調用任何函數或方法,並從數組中取參數。

或者,您可以使用ReflectionFunction::invokeArgs,但除call_user_func_array之外沒有任何好處,除非您已經在某些其他方面使用此類(如檢查您調用的函數是否接受適當的參數類型和類型)。

5
call_user_func_array($funcPrototype, $function_call_spec["parameters"]); 

您可能希望創建一個包裝,名稱的功能根據自己的喜好,如:

function InvokeFunction($function, $args = array()) { 
    return call_user_func_array($function, (array)$args); 
} 

有了這個功能,你可以把它在3種不同的方式:

$return = InvokeFunction('doStuff'); 
$return = InvokeFunction('doStuff', $single_arg); 
$return = InvokeFunction('doStuff', $multiple_args); 
+0

感謝您的諮詢! – sharkin 2008-10-11 12:28:36

0

call_user_func_array()是最好的選擇,如果你不需要執行合同,否則使用ReflectionFunction