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); } 

Solutions Collecting From Web of "PHP – Получить все параметры из функции (даже необязательной)"

Вы можете выполнить это, используя класс функции 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 ) 

демонстрация

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); } 

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