2011-01-23 60 views
2

我需要使用Reflection API調用函數。該函數具有可選參數,我需要調用它來提供其中的一些參數。PHP反射和invokeArgs():強制參數使用其默認值

例如,我有這樣的功能:

public function doSomething($firstParam, $secondParam = "default", $thirdParam = "default) 

而我使用invokeArgs()調用doSomething(),傳遞代表參數省略設置值到可選$secondParam值的數組:

$parameters = array("firstParam"=>"value", "thirdParam"=>"thirdValue"); 
$reflectedDoSomething->invokeArgs($instance, $parameters); 

這裏發生的事情是,invokeArgs()調用連續設置其參數的方法,而不跳過$secondParam,該值現在被賦值爲「thirdValue」並省略$thirdParam。這在邏輯上是正確的。該方法被調用,如doSomething("value", "thirdValue")

我想在這裏做的是強制$secondParam使用其默認值。在$parameters陣列中設置"secondParam" => null不是解決方案,因爲null是一個值。

它是否可能使用反射?

感謝

回答

2

查看關於the docs for invokeArgs()的第一條評論。

所以,只需要運行通過一個簡單的算法PARAMS(你可以爲這個包裹創建一個功能,如果你想):

$reflection = new ReflectionMethod($obj, $method); 

$pass = array(); 
foreach($reflection->getParameters() as $param) { 
    /* @var $param ReflectionParameter */ 
    if(isset($args[$param->getName()])) { 
     $pass[] = $args[$param->getName()]; 
    } else { 
     $pass[] = $param->getDefaultValue(); 
    } 
} 
$reflection->invokeArgs($obj, $pass); 
1

如何不設置關聯名稱secondParam,而是把一個null作爲第二個第二個參數。

$parameters = array("firstParam"=>"value", null, "thirdParam"=>"thirdValue");