2013-07-03 109 views
9

我正在尋找一種反轉的func_get_args()。我想知道當定義函數時參數是如何命名的。這樣做的原因是我不想使用作爲參數傳遞設置變量時重複自己通過一個方法:如何在PHP中獲取函數的參數名稱?

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

這是矯枉過正,這是一個愚蠢的想法,還是有更好的方法來實現這個目標?

回答

1

雖然這不是不可能,但通常使用其他方法會更好。這裏是SO對一個類似問題的鏈接:

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

你可以做的是傳遞一個對象內所有參數,而不是將它們一個接一個。我假設你正在做這個與數據庫有關的事情,你可能想閱讀關於ORM的內容。

18

你可以使用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()prints

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

代碼段創建包含參數名稱作爲鍵和參數值作爲對應值的數組:

$ref = new ReflectionFunction(__FUNCTION__); 

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