是否有一個PHP函數可以爲我提供通過參數(func_get_args)和任何未通過的默認值?如何獲得func_get_args&默認使用call_user_func_array
注意:此函數僅返回傳遞參數的副本,並且不包含默認(未傳遞)參數。
是否有一個PHP函數可以爲我提供通過參數(func_get_args)和任何未通過的默認值?如何獲得func_get_args&默認使用call_user_func_array
注意:此函數僅返回傳遞參數的副本,並且不包含默認(未傳遞)參數。
伊夫創建名爲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捕捉和拋出的錯誤。
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;
}
輝煌的謝謝。我會研究這個 – TarranJones
是否有isDefaultValueAvailable()和isOptional()之間的差異,當然,讓一個paramanter可選的唯一方法是提供一個默認值? – TarranJones
isOptional vs isDefaultValueAvailable http://stackoverflow.com/questions/23774355/php-reflectionparameter-isoptional-vs-isdefaultvalueavailable – TarranJones
[Reflection](http://www.php.net/manual/en/class.reflection.php)或使用PHP5.6'...' –
[PHP - 從函數獲取所有參數(即使是可選的一個)](輝煌的謝謝你!)(http://stackoverflow.com/questions/21760689/php-get-all-parameters-from-a-function-even-the-optional-one) –