1. ホーム
  2. php

[解決済み】関数でデフォルトの引数を使用する

2022-04-10 12:50:19

質問

PHPの関数のデフォルト値について混乱しています。例えば、次のような関数があるとします。

function foo($blah, $x = "some value", $y = "some other value") {
    // code here!
}

xにはデフォルトの引数を使用し、$yには別の引数を設定したい場合はどうすればよいですか?

いろいろと試しているのですが、ますます分からなくなってきました。例えば、この2つを試してみました。

foo("blah", null, "test");
foo("blah", "", "test");

しかし、どちらも$xに適切なデフォルト引数を与える結果にはなりません。また、変数名で設定することも試みました。

foo("blah", $x, $y = "test");   

私はこのようなものがうまくいくことを十分に期待していました。しかし、全く期待通りにはいきません。何をやっても、関数を呼び出すたびにデフォルトの引数を入力する羽目になりそうです。そして、私は何か明らかなことを見逃しているに違いありません。

解決するには?

関数宣言を以下のように変更することで、やりたいことができるようにすることを提案します。

function foo($blah, $x = null, $y = null) {
    if (null === $x) {
        $x = "some value";
    }

    if (null === $y) {
        $y = "some other value";
    }

    code here!

}

こうすることで、次のような呼び出しを行うことができます。 foo('blah', null, 'non-default y value'); を指定すると、思い通りに動作します。 $x はデフォルト値のままです。

このメソッドで、NULL値を渡すということは、あるパラメータのデフォルト値を、その後に続くパラメータのデフォルト値として上書きしたい場合に、その値を渡すということです。

他の回答にある通りです。

デフォルトのパラメータは、関数の最後の引数としてのみ機能します。 もし、関数の定義の中でデフォルト値を宣言したいのであれば、以下のようになります。 あるパラメータを省略し、それに続くパラメータをオーバーライドする方法はありません。

様々な数のパラメータや様々な型のパラメータを受け取ることができるメソッドがある場合、私はしばしば Ryan P. が示した答えと同じように関数を宣言します。

もうひとつ例を挙げましょう(これは質問の答えにはなりませんが、参考になれば幸いです)。

public function __construct($params = null)
{
    if ($params instanceof SOMETHING) {
        // single parameter, of object type SOMETHING
    } elseif (is_string($params)) {
        // single argument given as string
    } elseif (is_array($params)) {
        // params could be an array of properties like array('x' => 'x1', 'y' => 'y1')
    } elseif (func_num_args() == 3) {
        $args = func_get_args();

        // 3 parameters passed
    } elseif (func_num_args() == 5) {
        $args = func_get_args();
        // 5 parameters passed
    } else {
        throw new \InvalidArgumentException("Could not figure out parameters!");
    }
}