私はこのソリューションが、2.5年前にPHPを使用し始めた時点であったと思います。私が作成した例ではうまくいきますが、なぜ完全に拡張できないのか分かりません。これは、以前に提案されているものに比べて以下の利点があります。
(I)関数内のパラメータへのすべてのアクセスのパラメータが完全ではなく、配列へのアクセスを必要とするよりも、宣言されたかのように、名前付き変数である
(ⅱ)それを(iii)既存の関数を非常に迅速かつ容易に適合させることができます。(iii)関数のシグネチャで行うデフォルトのパラメータを定義する不可避的な必要性に加えて、追加のコードの1行だけが必要です。とにかく、それらを配列で定義します)。追加ラインの信用供与は、Bill Karwinによるものです。この行はすべての関数で同じです。
方法
その必須パラメータを使用して関数を定義し、オプションの配列
は、ローカル変数として、あなたのオプションのパラメータ
核心を宣言します。すべてのオプションのパラメータの事前宣言されたデフォルト値を置き換えます配列を通過したものを使用します。
extract(array_merge($arrDefaults, array_intersect_key($arrOptionalParams, $arrDefaults)));
function test_params($a, $b, $arrOptionalParams = array()) {
$arrDefaults = array('c' => 'sat',
'd' => 'mat');
extract(array_merge($arrDefaults, array_intersect_key($arrOptionalParams, $arrDefaults)));
echo "$a $b $c on the $d";
}
、その必須パラメータ、およびあなたが例えば
が必要なものだけのオプションパラメータを渡し、関数を呼び出した後、この
test_params('The', 'dog', array('c' => 'stood', 'd' => 'donkey'));
test_params('The', 'cat', array('d' => 'donkey'));
test_params('A', 'dog', array('c' => 'stood'));
のようにそれを呼び出します
結果:
犬は猫がロバ
犬に座っロバ
に立った
暗黙のサポートはありませんが、受け入れられた回答よりも優れた回避策があります。下のWalfの解を参照してください。あなたが私の解決策でそれを必要とするかどうかについてもっと詳細があります(私は私が独立して到着したことを誓います)。 – DJDave