0

次の形式の連想配列があります。

$params = array(
    'paramName_4'=>'param_4', 
    'paramName_2'=>'param_2',
    // ...,
    'paramName_6'=>'param_6',
); 

myFunctionまた、次のように定義された関数もあります。

public function myFunction($paramName_1, $paramName_2, $paramName_3, ....);

パラメータを照合して関数を呼び出すことができるように、PHPに「解析」関数が存在しmyFunctionますか(パラメータシーケンスに対してソートされていなくてもmyFunction)? というか、できるかな

my_magic(__NAMESPACE__.'\\myFunction', $params);

この「魔法の」機能は存在しますか?そうでない場合、どうすれば実装できますか?

4

3 に答える 3

4

リフレクションを使用して実装できます。方法は次のとおりです。

// The input is the array of arguments and the function name
$arguments = array(....);
$functionName = __NAMESPACE__.'\\myFunction';

$reflector = new \ReflectionFunction($functioName);
$params = $reflector->getParameters();
$values = array();

foreach ($params as $param) {
    $name = $param->getName();
    $isArgumentGiven = array_key_exists($name, $arguments);
    if (!$isArgumentGiven && !$param->isDefaultValueAvailable() {
        die ("Parameter $name is mandatory but was not provided");
    }

    $values[$param->getPosition()] =
        $isArgumentGiven ? $arguments[$name] : $param->getDefaultValue();
}

// You can now call the function:
call_user_func($functionName, $values);
于 2013-01-31T16:24:56.353 に答える
2

ksort()はい、@ Jonの例のようにReflectionを使用できますが、問題がパラメータが正しい順序になっていないことだけである場合は、単にそれらを使用するか、正しい順序に並べてみませんかuksort()

次に、を使用できますcall_user_func_array()。問題が解決しました。

$params = array(....);

uksort($params, function($a,$b) {
    //sort the params into the known order....
    $sortOrder = array('param1','param2','param3','param4');
    return (array_search($a, $sortOrder) > array_search($b, $sortOrder)) ? -1 : 1;
});

//now that $params is in the right order we can do this....
$retVal = call_user_func_array($func, $params);

最も効率的な方法であるため、ここでparamの順序をハードコーディングしました。正しいパラメータの順序が事前にわからない関数を呼び出す場合は、そうです。リフレクションを使用する必要があります。しかし、それはかなりありそうもないと思います(未知のパラメータリストを未知の関数に渡すことは、ハッカーにとっては金鉱のように聞こえます)

于 2013-01-31T16:27:42.473 に答える
0

これは、特定の関数/メソッドの引数解決を行うライブラリです: ArgumentsResolver

于 2014-12-28T00:36:09.513 に答える