2013-07-03 18 views
9

Szukam pewnego rodzaju odwróconego func_get_args(). Chciałbym dowiedzieć się, jak parametry zostały nazwane, gdy funkcja została zdefiniowana. Powodem tego jest nie chcę się powtarzać przy nastawie zmienne przekazywane jako argumenty za pomocą metody:Jak uzyskać nazwy parametrów funkcji w PHP?

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

Idealnie mógłby zrobić coś takiego:

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

Czy to przesada, czy to jest głupi pomysł, czy jest o wiele lepszy sposób, aby to się stało?

Odpowiedz

1

Chociaż nie jest to niemożliwe, zwykle lepiej jest zastosować inną metodę. Tu jest link do podobnego pytania na SO:

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

Co można zrobić, to przekazać wszystkie parametry wewnątrz obiektu, zamiast przekazywać je jeden po drugim. Zakładam, że robisz to w odniesieniu do baz danych, możesz chcieć przeczytać o ORMach.

18

Można użyć Reflection:

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

Ponieważ używasz to w klasie, można użyć ReflectionMethod zamiast ReflectionFunction:

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

Oto przykład roboczych:

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

Gdzie powyższy var_dump()prints:

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

Fragment kodu, który tworzy tablicę zawierającą nazwy parametrów jak klucze i wartości parametrów odpowiadające im wartości:

$ref = new ReflectionFunction(__FUNCTION__); 

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