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);
}
Вероятно, это может быть связано с небольшим улучшением таких сбоев и сбоев в работе.