2016-04-29 106 views
1

是否有一個PHP函數可以爲我提供通過參數(func_get_args)和任何未通過的默認值?如何獲得func_get_args&默認使用call_user_func_array

注意:此函數僅返回傳遞參數的副本,並且不包含默認(未傳遞)參數。

+1

[Reflection](http://www.php.net/manual/en/class.reflection.php)或使用PHP5.6'...' –

+1

[PHP - 從函數獲取所有參數(即使是可選的一個)](輝煌的謝謝你!)(http://stackoverflow.com/questions/21760689/php-get-all-parameters-from-a-function-even-the-optional-one) –

回答

0

伊夫創建名爲func_get_all_args函數返回相同的陣列func_get_args而是包括任何缺少的默認值。

function func_get_all_args($func, $func_get_args = array()){ 

    if((is_string($func) && function_exists($func)) || $func instanceof Closure){ 
     $ref = new ReflectionFunction($func); 
    } else if(is_string($func) && !call_user_func_array('method_exists', explode('::', $func))){ 
     return $func_get_args; 
    } else { 
     $ref = new ReflectionMethod($func); 
    } 
    foreach ($ref->getParameters() as $key => $param) { 

     if(!isset($func_get_args[ $key ]) && $param->isDefaultValueAvailable()){ 
      $func_get_args[ $key ] = $param->getDefaultValue(); 
     } 
    } 
    return $func_get_args; 
} 

使用

function my_function(){ 

    $all_args = func_get_all_args(__FUNCTION__, func_get_args()); 
    call_user_func_array(__FUNCTION__, $all_args); 
} 

public function my_method(){ 

    $all_args = func_get_all_args(__METHOD__, func_get_args()); 
    // or 
    $all_args = func_get_all_args(array($this, __FUNCTION__), func_get_args()); 

    call_user_func_array(array($this, __FUNCTION__), $all_args); 
} 

這或許可以做一點改良,例如AC捕捉和拋出的錯誤。

2

使用ReflectionFunction

function test($a, $b = 10) { 
    echo $a, ' ', $b; 
} 

$rf = new ReflectionFunction('test'); 
foreach ($rf->getParameters() as $p) { 
    echo $p->getName(), ' - ', $p->isDefaultValueAvailable() ? 
    $p->getDefaultValue() : 'none', PHP_EOL; 
} 
+0

輝煌的謝謝。我會研究這個 – TarranJones

+0

是否有isDefaultValueAvailable()和isOptional()之間的差異,當然,讓一個paramanter可選的唯一方法是提供一個默認值? – TarranJones

+0

isOptional vs isDefaultValueAvailable http://stackoverflow.com/questions/23774355/php-reflectionparameter-isoptional-vs-isdefaultvalueavailable – TarranJones

相關問題