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 に答える