获取函数的参数名称

Got*_*tys 37 php

在PHP中考虑这个函数:

function test($name, $age) {}
Run Code Online (Sandbox Code Playgroud)

我需要以某种方式提取参数名称(用于自动生成自定义文档),以便我可以执行以下操作:

get_func_argNames('test');
Run Code Online (Sandbox Code Playgroud)

它会返回:

Array['name','age']
Run Code Online (Sandbox Code Playgroud)

这在PHP中甚至可能吗?

Tom*_*igh 67

你可以使用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
)
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用ReflectionMethod,例如`new ReflectionMethod('classname','methodname');`其余的应该是相同的. (7认同)
  • @Gotys:查找ReflectionParameter,从ReflectionFunction :: getParameters()获取这些数组.在上面的例子中,我只使用name属性,但是有一个defaultValue()方法可以帮助你 (2认同)

Luc*_*nte 13

现在是2019年,没人说这个吗?

只需使用get_defined_vars()

class Foo {
  public function bar($a, $b) {
    var_dump(get_defined_vars());
  }
}

(new Foo)->bar('first', 'second');
Run Code Online (Sandbox Code Playgroud)

结果:

array(2) {
  ["a"]=>
  string(5) "first"
  ["b"]=>
  string(6) "second"
}
Run Code Online (Sandbox Code Playgroud)

  • “该函数返回一个多维数组,其中包含所有已定义变量的列表,无论是环境变量、服务器变量还是用户定义变量,都在调用 get_define_vars() 的范围内。”它似乎返回所有可用的内容,包括全局变量等。所以使用这个的时候要小心。 (2认同)
  • @ADJenks,如果在函数内部调用,它不包含全局变量。 (2认同)

Art*_*nix 5

这是我在寻找反射而不是其他东西时碰到的一个老问题,但是我将抛弃当前的实现,以便对他人有所帮助。使用array_map

对于方法

    $ReflectionMethod =  new \ReflectionMethod($class, $method);

    $params = $ReflectionMethod->getParameters();

    $paramNames = array_map(function( $item ){
        return $item->getName();
    }, $params);
Run Code Online (Sandbox Code Playgroud)

对于功能

    $ReflectionFunction =  new \ReflectionFunction('preg_replace');
    $params = $ReflectionFunction->getParameters();
    $paramNames = array_map(function( $item ){
        return $item->getName();
    }, $params);
    echo '<pre>';
    var_export( $paramNames );
Run Code Online (Sandbox Code Playgroud)

产出

array(
    '0' => 'regex',
    '1' => 'replace',
    '2' => 'subject',
    '3' => 'limit',
    '4' => 'count'
)
Run Code Online (Sandbox Code Playgroud)

干杯,