2013-07-03 8 views
9

Sto cercando una sorta di inversione func_get_args(). Vorrei sapere come sono stati nominati i parametri quando è stata definita la funzione. La ragione di questo è non voglio ripetermi quando si utilizzano le variabili di impostazione passate come argomenti attraverso un metodo:Come ottenere i nomi dei parametri della funzione in PHP?

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

Idealmente avrei potuto fare qualcosa di simile:

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

È questo un peso inutile, è una semplice idea stupida, o c'è un modo molto migliore per farlo accadere?

risposta

1

Anche se non è impossibile farlo, di solito è meglio usare un altro metodo. Ecco un link ad una domanda simile su SO:

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

Che cosa si potrebbe fare è passare tutti i parametri all'interno di un oggetto, invece di passare uno per uno. Suppongo che tu stia facendo questo in relazione ai database, potresti voler leggere sugli ORM.

18

Potreste usare Reflection:

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

Dal momento che si sta utilizzando questo in una classe, è possibile utilizzare ReflectionMethod invece di ReflectionFunction:

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

Ecco un esempio di lavoro:

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

Dove sopra var_dump()prints:

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

Frammento di codice che crea una matrice contenente i nomi dei parametri come chiavi e valori di parametro come valori corrispondenti:

$ref = new ReflectionFunction(__FUNCTION__); 

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