14

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?

user1848605
  • 717
  • 2
  • 8
  • 13

4 Answers4

28

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) {
  }
}
nickb
  • 59,313
  • 13
  • 108
  • 143
1

Code snippet that creates an array containing parameter names as keys and parameter values as corresponding values:

$ref = new ReflectionFunction(__FUNCTION__);

$functionParameters = [];
foreach($ref->getParameters() as $key => $currentParameter) {
    $functionParameters[$currentParameter->getName()] = func_get_arg($key);
}
Nils
  • 189
  • 1
  • 14
0

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.

Community
  • 1
  • 1
Dany Caissy
  • 3,176
  • 15
  • 21
0

get_defined_vars will give you the parameter names and their values, so you can do

$params = get_defined_vars();
foreach ($params as $var=>$val) {
   $this->${var} = $val;
}
Tac Tacelosky
  • 3,165
  • 3
  • 27
  • 28