Получение имен аргументов функции
В PHP Рассмотрим эту функцию:
function test($name, $age) {}
Мне нужно как-то извлечь имена параметров (для автоматической генерации пользовательских документов), чтобы я мог сделать что-то вроде:
get_func_argNames('test');
и он вернется:
Array['name','age']
Возможно ли это в PHP?
Ответы
Ответ 1
Вы можете использовать Reflection:
function get_func_argNames($funcName) {
$f = new ReflectionFunction($funcName);
$result = array();
foreach ($f->getParameters() as $param) {
$result[] = $param->name;
}
return $result;
}
print_r(get_func_argNames('get_func_argNames'));
//output
Array
(
[0] => funcName
)
Ответ 2
Это старый вопрос, который я встречал при поиске чего-то другого, чем Reflection, но я выброшу свою текущую реализацию, чтобы она могла помочь кому-то другому. Использование array_map
Для метода
$ReflectionMethod = new \ReflectionMethod($class, $method);
$params = $ReflectionMethod->getParameters();
$paramNames = array_map(function( $item ){
return $item->getName();
}, $params);
Для функции
$ReflectionFunction = new \ReflectionFunction('preg_replace');
$params = $ReflectionFunction->getParameters();
$paramNames = array_map(function( $item ){
return $item->getName();
}, $params);
echo '<pre>';
var_export( $paramNames );
Выходы
array(
'0' => 'regex',
'1' => 'replace',
'2' => 'subject',
'3' => 'limit',
'4' => 'count'
)
Приветствия,
Ответ 3
В дополнение к Tom Haigh ответьте, если вам нужно получить значение по умолчанию дополнительных атрибутов:
function function_get_names($funcName){
$attribute_names = [];
if(function_exists($funcName)){
$fx = new ReflectionFunction($funcName);
foreach ($fx->getParameters() as $param){
$attribute_names[$param->name] = NULL;
if ($param->isOptional()){
$attribute_names[$param->name] = $param->getDefaultValue();
}
}
}
return $attribute_names;
}
Полезно для проверки типа переменной.
Ответ 4
@Tom Haigh, или сделайте это более стильным:
function getArguments( $funcName ) {
return array_map( function( $parameter ) { return $parameter->name; },
(new ReflectionFunction($funcName))->getParameters() );
}
// var_dump( getArguments('getArguments') );
Ответ 5
func_get_args
function my($aaa, $bbb){
var_dump( func_get_args() );
}
my("something","something"); //result: array('aaa' => 'something', 'bbb' => 'something');
также существуют другие глобальные функции: get_defined_vars()
, который возвращает не только функцию, но и все переменные.
Ответ 6
Это 2019 год, и никто этого не сказал?
Просто используйте get_defined_vars()
:
class Foo {
public function bar($a, $b) {
var_dump(get_defined_vars());
}
}
(new Foo)->bar('first', 'second');
Результат:
array(2) {
["a"]=>
string(5) "first"
["b"]=>
string(6) "second"
}