Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get function's parameters names in PHP?

I'm looking for a sort of reversed func_get_args(). I would like to find out how the parameters were named when function was defined. The reason for this is I don't want to repeat myself when using setting variables passed as arguments through a method:

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

Ideally I could do something like:

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

Is this an overkill, is it a plain stupid idea, or is there a much better way to make this happen?

like image 558
user1848605 Avatar asked Jul 03 '13 17:07

user1848605


2 Answers

You could use Reflection:

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

Since you're using this in a class, you can use ReflectionMethod instead of ReflectionFunction:

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

Here is a working example:

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);

Where the above var_dump() prints:

object(ClassName)#1 (3) {
  ["paramJohn"]=>
  string(4) "John"
  ["paramJoe"]=>
  string(3) "Joe"
  ["paramMyObject"]=>
  object(stdClass)#2 (0) {
  }
}
like image 184
nickb Avatar answered Oct 14 '22 08:10

nickb


While it's not impossible to do it, it's usually better to use another method. Here is a link to a similar question on SO :

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

What you could do is pass all your parameters inside of an object, instead of passing them one by one. I'm assuming you are doing this in relation to databases, you might want to read about ORMs.

like image 26
Dany Caissy Avatar answered Oct 14 '22 07:10

Dany Caissy