Я хочу получить все параметры (переданные или отсутствующие) из функции.
Пример:
<?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); }
Вы можете выполнить это, используя класс функции 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); }
Вероятно, это может быть связано с небольшим улучшением таких сбоев и ловушек.