如何在PHP中获取函数的参数名称?

时间:2013-07-03 17:56:43

标签: php variables setter

我正在寻找一种逆转的func_get_args()。我想知道在定义函数时如何命名参数。这样做的原因是我不想在使用通过方法作为参数传递的设置变量时重复自己:

public function myFunction($paramJohn, $paramJoe, MyObject $paramMyObject)
{
     $this->paramJohn = $paramJohn;
     $this->paramJoe = $paramJoe;
     $this->paramMyObject = $paramMyObject;
}

理想情况下,我可以做类似的事情:

foreach (func_get_params() as $param)
   $this->${$param} = ${$param};
}

这是一种矫枉过正,这是一个简单的愚蠢想法,还是有更好的方法来实现这一目标?

3 个答案:

答案 0 :(得分:21)

您可以使用Reflection

$ref = new ReflectionFunction('myFunction');
foreach( $ref->getParameters() as $param) {
    echo $param->name;
}

由于您在课堂上使用此功能,因此可以使用ReflectionMethod代替ReflectionFunction

$ref = new ReflectionMethod('ClassName', 'myFunction');

这是一个有效的例子:

class ClassName {
    public function myFunction($paramJohn, $paramJoe, $paramMyObject)
    {
        $ref = new ReflectionMethod($this, 'myFunction');
        foreach( $ref->getParameters() as $param) {
            $name = $param->name;
            $this->$name = $$name;
        }
    }
}

$o = new ClassName;
$o->myFunction('John', 'Joe', new stdClass);
var_dump( $o);

以上var_dump() prints

object(ClassName)#1 (3) {
  ["paramJohn"]=>
  string(4) "John"
  ["paramJoe"]=>
  string(3) "Joe"
  ["paramMyObject"]=>
  object(stdClass)#2 (0) {
  }
}

答案 1 :(得分:1)

虽然并非不可能,但使用其他方法通常会更好。以下是关于SO的类似问题的链接:

How to get a variable name as a string in PHP?

您可以做的是将所有参数传递到对象内部,而不是逐个传递它们。我假设您在与数据库相关的情况下这样做,您可能想要阅读有关ORM的内容。

答案 2 :(得分:1)

代码片段,用于创建一个包含参数名称作为键和参数值作为相应值的数组:

$ref = new ReflectionFunction(__FUNCTION__);

$functionParameters = [];
foreach($ref->getParameters() as $key => $currentParameter) {
    $functionParameters[$currentParameter->getName()] = func_get_arg($key);
}