如何将函数作为可选变量传递给PHP中的call_user_func

时间:2013-02-01 20:23:38

标签: php php-5.2

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

以下是代码示例,可选参数$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");

3 个答案:

答案 0 :(得分:1)

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

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

就我个人而言,我认为它与eval和变量变量相同:一个可怕的想法。毕竟,如果您有$foo = "function_name";,则可以致电$foo(),然后拨打function_name

无论如何,回到这一点,只需将其称为普通函数,并为其提供所需的参数。如果有必要,请通过null

答案 1 :(得分: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"));

或者这个来自类的调用可以将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

答案 2 :(得分:0)

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

为什么不只是创建一个调用函数的函数?

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

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

然后只需将其称为:call_createTable("data");