1

call_user_funcそこで、を使用して、関数のオプションのパラメーターにデータを渡したいと思います。

これがコードの例です。オプションのパラメーターは、別のファイルで宣言された$dataと呼ばれる関数を表します。data関数の名前でパラメーターを設定し、createtable関数内で呼び出すを使用call_user_funcして呼び出すだけですが、機能しないようです。

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関数の名前が必ずしも前もって知られていない場合に使用することを目的としています。たとえば、複数の関数と1つの変数があり、その変数に呼び出す関数の名前が含まれているとします。

個人的には、変数と同等でevalあり、変数と同等だと思います。恐ろしい考えです。結局のところ、あなたが持っているなら$foo = "function_name";、あなたは電話をすることができ$foo()、それはを呼び出すでしょうfunction_name

とにかく、要点に戻って、それを通常の関数として呼び出し、必要なパラメーターを指定します。必要に応じて合格nullします。

于 2013-02-01T20:37:21.033 に答える
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); 
} 

値を設定しない場合__namedUnsetValueの代わりにPutNull

于 2013-02-01T20:40:06.103 に答える
0

最後のパラメータを渡したいだけで、最初の3つについては気にしないようです。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 に答える