48

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

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');

結果:

value1
not default

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

ありがとう。

4

5 に答える 5

58

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番目の配列の重複要素でオーバーライドすることで可能になります。

于 2012-05-15T08:53:08.873 に答える
13

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

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

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

funcName (null, 'non default');

Result:

value1
non default
于 2012-05-15T08:50:37.547 に答える
3

PHP8.0アップデート

PHP 8.0以降、必要なソリューションが利用可能です:名前付き引数

function funcName($param1 = 'value1', $param2 = 'value2', $param3 = 'value3') {
    ...
}

以前は$param1、nullまたはデフォルト値のいずれかの値を渡す必要がありましたが、現在は2番目のパラメーターしか渡すことができません。

funcName(param2: 'value');

そして、引数の順序を気にする必要はありません。

funcName(param2: 'value', param3: 'value');

//is the same as

funcName(param3: 'value', param2: 'value');

さらに、配列を引数として渡すなど、名前付き引数を使用して実行できるいくつかの凝ったことがあります。配列に格納する正確なキーがわからず、変数の順序について心配する必要がなくなった場合に役立ちます。

$args = [
    'param3' => 'value',
    'param2' => 'value',
];

funcName(...$args);

//works the same as

funcName(param2: 'value', param3: 'value');

配列内の値に引数として名前を付ける必要はありません(もちろん、引数の順序が一致するまで)。

$args = [
    'value1',
    'param3' => 'value3',
    'param2' => 'value2',
];

funcName(...$args);

//works the same as

funcName(param1: 'value1', param3: 'value3', param2: 'value2');

//and

funcName('value1', 'value2', 'value3');
于 2020-09-25T23:20:37.767 に答える
1

問題の簡単な解決策は、次を使用する代わりに、次のとおりです。

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
于 2014-12-01T20:27:15.120 に答える
0

を使用'_'して、未定義の定数を参照し、その後も変数を渡し続けることができます。

例(例から拡張):

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

次のような関数の呼び出し:

funcName('_','Some Pass value');

これを出力します:

value1
Some Pass value
于 2021-06-17T16:22:49.080 に答える