18

PHP関数のデフォルトパラメータとして配列を使用することは可能ですか?

私は次のことをしたいと思います:

$arr = array(1,2,3,4);

function sample($var1, $var2, $var3 = $arr){
    echo $var1.$var2;
    print_r($var3);
}

sample('a','b');
// Should still work without the third parameter and default to $arr
4

4 に答える 4

24

いいえ、これは不可能です。デフォルト値の右辺の式は、定数または配列リテラルである必要があります。

function sample($var1, $var2, $var3 = array(1, 2, 3, 4))
{
}

この動作が必要な場合は、クロージャーを使用できます。

$arr = array(1, 2, 3, 4);

$sample = function ($var1, $var2, array $var3 = null) use ($arr) {
    if (is_null($var3)) {
        $var3 = $arr;
    }

    // your code
}

$sample('a', 'b');

クラスで表現することもできます。

class Foo
{
    private static $arr = array(1, 2, 3, 4);

    public static function bar($var1, $var2, array $var3 = null)
    {
        if (is_null($var3)) {
            $var3 = self::$arr;
        }

        // your code here
    }
}

Foo::bar('a', 'b');
于 2013-01-22T10:48:50.287 に答える
7

$arr関数定義に渡すことはできません。次のことを行う必要があります。

function sample($var1, $var2, $var3 = array('test')){
    echo $var1.$var2;
    echo print_r($var3);
}

sample('a','b'); // output: abArray ( [0] => test ) 1

または、本当に汚くなりたい場合(私はそれをお勧めしません..):

$arr = array('test');

function sample($var1, $var2, $var3 = null){
    if($var3 == null){
      global $arr;
      $var3 = $arr;
    }
    echo $var1.$var2;
    echo print_r($var3);
}

sample('a','b');
于 2013-01-22T10:47:48.950 に答える
1

(完全な答えではないかもしれませんが、いくつかの有用なケースをカバーしています。)

関数(またはメソッド)の引数として配列を使用して1つ以上のオプションを取得する場合は、デフォルトのオプションセットを設定しても効果がない場合があります。代わりに、を使用できますarray_replace()

たとえば、 2つのキーと。$optionsを持つ配列を取得するサンプル引数を考えてみましょう。その引数にデフォルト値を設定すると、渡されたカスタム値で関数を使用するときに引数がオーバーライドされます。この例では、キーを1つだけに設定すると、キーが削除されます。適切な解決策の1つは、次のとおりです。counttitle$option$optionscounttitle

function someCoolFunc($options = []) {
    $options = array_replace([
        "count" => 144,
        "title" => "test"
    ], $options);
    
    // ... 
}

上記の例では、ユーザーが空の配列を指定した場合でも、インデックスが存在countすることが保証されます(関数内の引数の順序が重要であることに注意してください)。titlearray_replace()

注:説明されているケースでは、クラス(またはインターフェース)を使用することもオプションですが、それよりも配列を選択する理由の1つは、単純さ(またはパフォーマンス)である可能性があります。

于 2019-07-04T19:04:52.707 に答える
0

上記の最後の例を試しました。これが私の同等のテストでした:

function someFunc($options = [])
    {
        $options = array_replace([
            "<br>", "<b>", "<i>", "<u>", "<hr>", "<span>"
        ], $options);
        print_r($options);
    }

結果は次のとおりです。

>>> somefunc()
Array
(
    [0] => <br>
    [1] => <b>
    [2] => <i>
    [3] => <u>
    [4] => <hr>
    [5] => <span>
)
=> null

しかし、タグを追加しようとするとどうなるかわかります。元の値がどうなるかに注意してください。要素[0]が変更されました。配列は次の場所に追加されません。

>>> someFunc(["<div>"])
Array
(
    [0] => <div>
    [1] => <b>
    [2] => <i>
    [3] => <u>
    [4] => <hr>
    [5] => <span>
)
=> null

これにより、デフォルトオプションに要素を追加できます。

function someFunc($options = array())
    {
       array_push($options, "<br>", "<b>", "<i>", "<u>", "<hr>", "<span>");
       return $options;
    }

結果は次のとおりです。

>>> someFunc()
=> [
     "<br>",
     "<b>",
     "<i>",
     "<u>",
     "<hr>",
     "<span>",
   ]

---
 someFunc(["<div>","<table>"]);
=> [
     "<div>",
     "<table>",
     "<br>",
     "<b>",
     "<i>",
     "<u>",
     "<hr>",
     "<span>",
   ]

このようにして、デフォルト値がに追加されます。

于 2021-06-03T13:47:37.300 に答える