1

所以我想使用call_user_func将数据传递给函数的可选参数。

这是代码示例,可选参数表示在另一个文件中声明$data的函数调用。data我只是希望通过使用call_user_func它将使用函数名称设置参数并在 createtable 函数中调用它来调用它,但似乎不起作用。

我从 PHP 手册中获得了示例,但createTable包含许多参数。如何call_user_func仅将字符串分配给默认设置data的可选参数?$dataNULL

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");
4

3 回答 3

1

即使call_user_func您必须传递所有参数。

无论如何,call_user_func它是在函数名称不一定事先知道的情况下使用的。例如,您可能有多个函数和一个变量,而该变量包含要调用的函数的名称。

我个人认为它eval与可变变量相当:一个可怕的想法。毕竟,如果你有$foo = "function_name";那么你可以打电话$foo(),它会打电话function_name

无论如何,回到正题,只需将其作为普通函数调用并为其提供所需的参数即可。null如果必须通过。

于 2013-02-01T20:37:21.033 回答
0

看来您只想传递最后一个参数,而不用担心第一个三个参数。我认为call_user_func这里根本不是正确的工具。

为什么不创建一个调用你的函数的函数呢?

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

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

然后只需像这样简单地调用它:call_createTable("data");.

于 2013-02-01T20:59:02.790 回答
0

你必须像这样传递价值

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

或者这个来自班级的电话

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

或者你可以使用它可以获得 arg 作为数组

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

或者 this for call from class 可以将 arg 作为数组

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

或者这也可以帮助你它不需要传递所有参数

 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 Put Null 而不是 Unset Value

于 2013-02-01T20:40:06.103 回答