名前付きパラメータを使用して PHP 関数を呼び出す

WBOY
リリース: 2016-06-21 08:51:30
オリジナル
971 人が閲覧しました

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"; };

クラス MissingArgumentException extends Exception {

}

関数 call_user_func_named_array($method, $arr){

$ref = 新しい ReflectionFunction($method); $params = [];
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']); //すべてのパラメータを渡します

call_user_func_named_array($x, ['bar' => 'world']) // パラメータを 1 つだけ渡します call_user_func_named_array($x, []) //例外をスローします

更新: いくつかの改善について熱心な貢献者に感謝します:

$x = function($bar, $foo="9") {

echo $foo, $bar, "n"; };

クラス MissingArgumentException extends Exception {

}

関数 call_user_func_named_array($method, $arr){

$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, ['foo' => 'hello ', 'bar' => 'world']); //すべてのパラメータを渡します

call_user_func_named_array($x, ['bar' => 'world']) // パラメータを 1 つだけ渡します call_user_func_named_array($x, []) //例外をスローします

$y = make_named_array_function($x);

$y(['foo' => 'hello ', 'bar' => 'world']) //すべてのパラメータを渡します $y(['bar' => 'world']) // パラメータを 1 つだけ渡します
$y([]); //例外をスローします



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート