Есть ли функция PHP, которая может предоставить мне переданные аргументы (func_get_args) и какие-либо значения по умолчанию, которые не были приняты?

Примечание. Эта функция возвращает только копию переданных аргументов и не учитывает аргументы по умолчанию (непереданные).

php
3
TarranJones 29 Апр 2016 в 14:38

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;
}
2
Ruslan Osmanov 29 Апр 2016 в 11:43

Айв создал функцию под названием 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);
}

Это, вероятно, можно было бы сделать с небольшим улучшением, например с ошибками перехвата и выброса переменного тока.

0
TarranJones 29 Апр 2016 в 14:24