2013-02-01 2 views
1

그래서 call_user_func을 사용하여 함수의 선택적 매개 변수에 데이터를 전달하고 싶습니다.PHP에서 call_user_func에 선택적 변수로 함수를 전달하는 방법

다음은 코드의 예입니다. 선택 매개 변수 $data은 다른 파일에 선언 된 data이라는 기능을 나타냅니다. 난 그냥 call_user_func 함수의 이름으로 매개 변수를 설정하고 createtable 함수 내에서 전화를 사용하여 호출되고 싶지만, 작동하지 않는 것.

PHP 설명서에서 예제를 얻었지만 createTable에는 많은 매개 변수가 포함되어 있습니다. call_user_funcdata 문자열을 $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"); 
+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); 

또는 같은 값을 통과해야하거나 배열로 인수

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 Unset 값 대신 Null 입력

+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

마지막 매개 변수를 전달하고 첫 번째 3을 걱정하지 않는 것 같습니다. 나는 여기에 call_user_func이 올바른 도구라고 생각하지 않습니다.

왜 함수를 호출하는 함수를 작성하지 않는 것이 좋을까요?

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

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

다음은 단지 call_createTable("data");입니다.

관련 문제