2010-10-30 118 views
5

我將所有調用傳遞給主映射函數 然後它應該根據字符串動態調用其他函數(直到這部分,事情很簡單) 問題是我想傳遞參數到第二個功能,這些參數可能會有所不同。 下面給出(不應該改變):動態函數參數

function test1($x){ 
    echo $x; 
} 

function test2($x, $y){ 
    echo $x * $y; 
} 

,現在又映射函數

function mapping ($str){ 
     switch ($str){ 
      case 'name1': 
       $fn_name = 'test1'; 
       $var = 5; 
       break; 
      case 'name2': 
       $fn_name = 'test2'; 
       $var = 5; 
       break; 
     } 
     $this->{$fn_name}($var); 
} 

然後這將運行映射:

$this->mapping('name1'); 
$this->mapping('name2'); // This one will crash as it need two variables 

當然的了上面的內容被簡化爲關注問題而不是代碼的目的。 問題是當函數有多個參數時(這很容易發生)。 我期待有開關的情況下,並根據如何填寫案例參數,行 $this->{$fn_name}($var);應該工作。

能否請您告知或給我點子,知道函數(test1,test2)結構不能改變。我不能突然開始使用func_get_args()func_get_arg()

回答

5

您可以使用ReflectionFunction及其invokeArgs()方法傳遞變量數組:

function mapping ($str) { 
    switch ($str) { 
     case 'name1': 
      $fn_name = 'test1'; 
      $fn_args = array(5); 
      break; 
     case 'name2': 
      $fn_name = 'test2'; 
      $fn_args = array(5, 10); 
      break; 
    } 

    $function = new ReflectionFunction($fn_name); 
    $function->invokeArgs($fn_args); 
} 
+1

你的建議是偉大的 累了,它工作正常。 但在php.net中探索後,如果找到call_user_func_array() ,它完美地解決了我的問題,但我仍然欠你一切:) – bhefny 2010-11-01 18:08:49

+2

FYI - ReflectionFunction不會在類方法上工作 - 實例或靜態 – phirschybar 2012-04-15 21:13:17

2

由於mapping()在你的代碼似乎是一個類的方法,取代它用:

public function __call($method, $args) 
{ 
    // possibly validate $method first, e.g. with a static map 
    return call_user_func_array($method, $args); 
} 

實例:

function foo($foo) { echo $foo; } 
function bar($foo, $bar) { echo "$foo - $bar"; } 

$this->foo('foo'); // outputs 'foo' 
$this->bar('foo', 'bar'); // outputs 'foo - bar' 

這意味着您的班級不應該有調用__call()的方法foo()bar()

雖然似乎是一個相當複雜的問題。您可能想要實現的更好的解決方案? :)