2013-02-01 18 views
1

中的call_user_func所以我想用call_user_func將數據傳遞給函數的可選參數。我如何將一個函數作爲可選變量傳遞給PHP

下面是一個代碼示例,可選參數$data表示在另一個文件中聲明的稱爲data的功能。我只是想通過使用call_user_func來調用該函數,該函數將該函數的名稱設置爲參數,並在createtable函數中調用它,但似乎不起作用。

我從PHP手冊中獲得了示例,但createTable包含許多參數。我如何才能讓call_user_func僅將data字符串分配給可選參數$data設爲NULL爲默認值?

function createTable($database, $table, $patch,$data = NULL) 
{ 

    echo "INFO: Adding '$table'in database '$database'.\n"; 
    $sql = "SHOW TABLES FROM $database WHERE Tables_in_$database='$table';"; 
    $result = mysql_query($sql); 
    $result_count = mysql_num_rows($result); 

    if ($result_count != 1) { 
      echo "ERROR: Can not find table '$table' in database '$database'.\n"; 
      $result = mysql_query($patch); 
      if (false === $result) { 
       echo "ERROR: Adding Table '$table' in database '$database' ... Failed\n"; 
       return false; 
      } 
      else { 
      echo "INFO: Adding Table '$table'in database '$database' ... Success\n"; 
      // using the optional parameter here 
       $data(); 
      return true; 
       } 

    } else { 

     if ($result_count == 1) { 
      echo "ERROR: Table '$table'already in database '$database'.\n"; 
      return false; 
     } 

    } 
} 

// Now I'm passing value to the optional parameter $ data that is NULL as default. 

call_user_func('createTable', "data"); 
+0

使用PHP版本5.2.11 – JBa

+0

那麼爲什麼你用'php-5.3'和'php-5.4'標記你的問題? –

+0

更好地讓我的問題被整個PHP社區看到。 – JBa

回答

0

必須從類

call_user_func(array(&$objectName->{$anotherObject},$functionName), $arg1, $arg2, $arg2); 

這樣

call_user_func('createTable', $database, $table, $patch,$data); 

或該呼叫傳遞價值,或者你可以使用這個可以ARG得到儘可能陣列

call_user_func_array("createTable", array("one", "two")); 

或本作來自課堂的電話可以獲得參數排序

call_user_func_array(array($foo, "bar"), array("three", "four")); 

或者這也可以幫助你它並不需要通過所有ARGS

function __named($method, array $args = array()) 
{ 

$reflection = new ReflectionFunction($method); 

$pass = array(); 
foreach($reflection->getParameters() as $param) 
{ 
    /* @var $param ReflectionParameter */ 
    if(isset($args[$param->getName()])) 
    { 
    $pass[] = $args[$param->getName()]; 
    } 
    else 
    { 
    try{ 
     $pass[] = $param->getDefaultValue(); 
    }catch(Exception $e){ 
     $pass[] = NULL; 
    } 
    } 
} 

    return $reflection->invokeArgs($pass); 
} 

我希望它的工作

樣本:

__named('createTable', array('data' => 'value')); 

,它是用於

public function __named($method, array $args = array()) 
{ 

    $reflection = new ReflectionMethod($this, $method); 

    $pass = array(); 
    foreach($reflection->getParameters() as $param) 
    { 
     /* @var $param ReflectionParameter */ 
     if(isset($args[$param->getName()])) 
     { 
     $pass[] = $args[$param->getName()]; 
     } 
     else 
     { 
    try{ 
      $pass[] = $param->getDefaultValue(); 
     }catch(Exception $e){ 
      $pass[] = NULL; 
     } 
     } 
    } 

    return $reflection->invokeArgs($this,$pass); 
} 

如果您不設置任何值__named放空而不是取消設置值

+0

如果我不想將任何值傳遞給$ database,$ table和$ patch,但只有$ data,該怎麼辦?如何格式化call_user_func? – JBa

+0

你可以做一些工作,你可以傳遞arg作爲數組 –

+1

@JBaL如果你沒有傳遞$ database,$ table和$ patch,你期望它們被設置爲什麼? –

1

即使使用call_user_func,您也必須通過所有參數。

無論如何,call_user_func是用於當功能的名稱不一定知道前面。例如,你可能有幾個函數和一個變量,並且該變量包含要調用的函數的名稱。

我個人認爲它與eval和變量變量一致:一個可怕的想法。畢竟,如果你有$foo = "function_name";那麼你可以撥打$foo(),它會打電話function_name

無論如何,回到正題,只需將其稱爲正常功能並給它所需的參數即可。如果必須通過null

+0

所以我怎麼會這樣「數據」只被分配到createTable中的最後一個可選參數? – JBa

+0

爲它提供所需參數的值,然後爲可選參數添加一個參數。 –

+0

我不認爲你明白我的意思......我只想將數據傳遞給最後一個可選參數......我應該填寫哪些其他需要來自call_user_func的數據的參數? – JBa

0

看來你只是想通過最後一個參數,而不用擔心前三個。我不認爲call_user_func在這裏是合適的工具。

爲什麼不只是一個函數調用你的函數?

function call_createTable($data){ 
    $database = '...'; 
    $table = '...'; 
    $patch = '...'; 

    return createTable($database, $table, $patch, $data); 
} 

然後,只需簡單地這樣調用它:call_createTable("data");

相關問題