2012-11-28 34 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