Python の優れた点は、次のように名前を使用して関数に引数を渡すことができることです。
my_foo_function(param_name="値", another_param_name="別の値")
今日、私は PHP 5.4 でも同じことをしたいと思いました (PHP 5.3 に簡単に移植できます)。PHP の組み込み call_user_func_array 関数に似た call_user_func_named 関数を書きました。コードは次のとおりです。$x = function($bar, $foo="9") {
echo $foo, $bar, "n";
};
}
$ref = 新しい ReflectionFunction($method);
$params = [];
call_user_func_named_array($x, ['bar' => 'world']) // パラメータを 1 つだけ渡します
call_user_func_named_array($x, []) //例外をスローします
更新: いくつかの改善について熱心な貢献者に感謝します:
foreach( $ref->getParameters() as $p ){
If( $p->isOptional() ){
If( isset($arr[$p->name]) ){
$params[] = $arr[$p->name];
}その他{
$params[] = $p->getDefaultValue();
}
}else if( isset($arr[$p->name]) ){
$params[] = $arr[$p->名前];
}その他{
throw new MissingArgumentException("パラメータ $p->name");
}
}
return $ref->invokeArgs( $params );
}
call_user_func_named_array($x, ['foo' => 'hello ', 'bar' => 'world']); //すべてのパラメータを渡します
echo $foo, $bar, "n";
};
}
$ref = 新しい ReflectionFunction($method);
$params = [];
foreach( $ref->getParameters() as $p ){
(!$p->isOptional() および !isset($arr[$p->name])) の場合、新しい MissingArgumentException("Missing パラメータ $p->name");
If (!isset($arr[$p->name])) $params[] = $p->getDefaultValue();
else $params[] = $arr[$p->name];
}
return $ref->invokeArgs( $params );
}
function make_named_array_function($func) {
return function($arr) use ($func) {
return call_user_func_named_array($func,$arr);
};
}
call_user_func_named_array($x, ['bar' => 'world']) // パラメータを 1 つだけ渡します
call_user_func_named_array($x, []) //例外をスローします
$y(['foo' => 'hello ', 'bar' => 'world']) //すべてのパラメータを渡します
$y(['bar' => 'world']) // パラメータを 1 つだけ渡します
$y([]); //例外をスローします