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数组有任意排序。

如何对该数组进行排序以匹配方法参数?
哦,也许,有更好的解决方案吗?命名参数?

4

1 回答 1

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);
于 2012-11-28T14:04:48.657 回答