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で変数名を文字列として取得するには?

できることは、パラメータを 1 つずつ渡すのではなく、すべてのパラメータをオブジェクト内に渡すことです。データベースに関連してこれを行っていると仮定しています。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 に答える