Подтвердить что ты не робот

Получение имен аргументов функции

В PHP Рассмотрим эту функцию:

function test($name, $age) {}

Мне нужно как-то извлечь имена параметров (для автоматической генерации пользовательских документов), чтобы я мог сделать что-то вроде:

get_func_argNames('test');

и он вернется:

Array['name','age']

Возможно ли это в PHP?

4b9b3361

Ответ 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"
}