2012-11-28 35 views
2

我正在使用反射來動態調用方法。爲動態調用方法排序參數數組

$object = new $class; 
$reflector = new ReflectionMethod($class, $method); 
$reflector->invokeArgs($object, $arguments); 

$arguments陣列看起來像:

Array 
(
    [fooparam] => false 
    [id] => 238133 
) 

稱爲可能的方法:

class MyClass 
{ 
    public function myMethod ($id, $fooParam) 
    { 
     // Whatever 
    } 
} 

的問題是,一切都來自前端設計師,根據data-*屬性,href。 ..所以$arguments數組有任意排序。

我怎樣才能排序這個數組匹配方法參數?
O也許,有沒有更好的解決方案?命名參數?

回答

2

使用ReflectionMethod::getParameters()得到的參數列表和過濾它們映射到其相應的位置,例如:

$sorted_args = array_map(function($param) use($arguments) { 
    $name = $param->getName(); 
    if (!isset($arguments[$name]) && !$param->isOptional()) 
     throw new BadMethodCallException("Argument '{$name}' is mandatory"); 

    return isset($arguments[$name]) ? $arguments[$name] : $param->getDefaultValue(); 
}, $reflector->getParameters()); 

你也可以使用一個簡單的循環foreach,它給你。

然後用$sorted_args,而不是調用的方法:

$reflector->invokeArgs($object, $sorted_args); 
+0

工作!對於像我這樣發佈'data- *'屬性的人來說,這只是一個邊緣筆記。如果'$ arguments'鍵變成小寫字母,只要在檢查'!isset($ arguments [$ name])'前檢查'strtolower($ name)'。我會編輯答案來說明這個問題。謝謝! – albertedevigo