web-dev-qa-db-ja.com

PHPデフォルト関数パラメータ値、「最後ではない」パラメータの「デフォルト値を渡す」方法は?

私たちのほとんどは、次の構文を知っています。

function funcName($param='value'){
    echo $param;
}
funcName();

Result: "value"

「最後ではない」パラメータのデフォルト値をどのように渡すのか疑問に思っていましたか?私はこの用語がかなり外れていることを知っていますが、簡単な例は次のようになります:

function funcName($param1='value1',$param2='value2'){
    echo $param1."\n";
    echo $param2."\n";
}

以下をどのように実現しますか?

funcName(---default value of param1---,'non default');

Result:

value1
not default

これが理にかなっていることを望み、基本的には最後ではないパラメータのデフォルト値を仮定したいと思います。

ありがとう。

46
anonymous-one

PHPは、あなたがやろうとしていることをサポートしていません。この問題の通常の解決策は、引数の配列を渡すことです。

_function funcName($params = array())
{
    $defaults = array( // the defaults will be overidden if set in $params
        'value1' => '1',
        'value2' => '2',
    );

    $params = array_merge($defaults, $params);

    echo $params['value1'] . ', ' . $params['value2'];
}
_

使用例:

_funcName(array('value1' => 'one'));                    // outputs: one, 2
funcName(array('value2' => 'two'));                    // outputs: 1, two
funcName(array('value1' => '1st', 'value2' => '2nd')); // outputs: 1st, 2nd
funcName();                                            // outputs: 1, 2
_

これを使用すると、すべての引数がオプションになります。引数の配列を渡すことにより、配列内にあるものはすべてデフォルトをオーバーライドします。これは、 array_merge() を使用することで可能です。2つの配列をマージし、最初の配列を2番目の配列の重複要素で上書きします。

53
MrCode

残念ながら、これは不可能です。これを回避するには、関数に次の行を追加することをお勧めします。

$param1 = (is_null ($param1) ? 'value1' : $param1);

その後、次のように呼び出すことができます。

funcName (null, 'non default');

Result:

value1
non default
12
Jeroen

あなたの問題のシンプルな解決策は、代わりに以下を使用することです:

funcName(---default value of param1---,'non default');

次の構文を使用します。

funcName('non default',---default value of param1---);

例:

function setHeight2($maxheight,$minheight = 50) {
    echo "The MAX height is : $maxheight <br>";
    echo "The MIN height is : $minheight <br>";
}

setHeight2(350,250);
setHeight2(350); // will use the default value of 50
1
Rohit Pavaskar