PHP - Получить все параметры из функции (даже необязательной)

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

Пример:

<?php
    function foo($a, $b=1)
    {
         return $a-$b;
    }
?>

Если я вызываю

$test = func_get_args(foo(10));
var_dump($test);

У меня будет только массив с [0] => 10.

Как я могу получить значения (-ы) необязательного параметра (-ов), даже если я не передам его/их? (Я знаю, что func_get_args возвращает только переданные параметры.)

EDIT: Чтобы быть более точным, вот что я делаю:

function insertLog($fct_name="-1", $type="-1", $error="-1", ....)
{
     // first thing
     $params = func_get_args();
     var_dump($params);
}

Ответ 1

Вы можете выполнить это, используя класс функций ReflectionFunction.

function foo($a, $b=1)
{
    $arr = array();
    $ref = new ReflectionFunction(__FUNCTION__);
    foreach($ref->getParameters() as $parameter)
    {
        $name = $parameter->getName();
        $arr[$name] = ${$name};
    }
    print_r($arr);

    // ...
}

Вызов функции:

foo(1);

Вывод:

Array
(
    [a] => 1
    [b] => 1
)

Демо

Ответ 2

func_get_args

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

Ive создала функцию func_get_all_args, которая использует Reflection. Он возвращает тот же массив, что и 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);
}

Вероятно, это может быть связано с небольшим улучшением таких сбоев и сбоев в работе.