14

我正在寻找一种颠倒的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};
}

这是一个矫枉过正的想法,还是一个愚蠢的想法,还是有更好的方法来实现这一点?

4

3 回答 3

27

你可以使用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() 打印的地方:

object(ClassName)#1 (3) {
  ["paramJohn"]=>
  string(4) "John"
  ["paramJoe"]=>
  string(3) "Joe"
  ["paramMyObject"]=>
  object(stdClass)#2 (0) {
  }
}
于 2013-07-03T18:01:23.377 回答
1

虽然这并非不可能,但通常最好使用另一种方法。这是关于 SO 的类似问题的链接:

如何在 PHP 中将变量名作为字符串获取?

您可以做的是将所有参数传递到对象内部,而不是一一传递。我假设您正在执行与数据库相关的操作,您可能想阅读有关 ORM 的信息。

于 2013-07-03T18:00:35.780 回答
1

创建包含参数名称作为键和参数值作为对应值的数组的代码片段:

$ref = new ReflectionFunction(__FUNCTION__);

$functionParameters = [];
foreach($ref->getParameters() as $key => $currentParameter) {
    $functionParameters[$currentParameter->getName()] = func_get_arg($key);
}
于 2015-12-09T09:52:49.183 回答