[解決済み】関数でデフォルトの引数を使用する
質問
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!");
}
}
関連
-
[解決済み】/var/www/htmlとは何ですか?[クローズド]
-
[解決済み] MATLABで関数のパラメータにデフォルト値を設定するにはどうすればよいですか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Bashでコマンドライン引数を解析するには?
-
[解決済み] バッチファイルに引数を渡すにはどうしたらいいですか?
-
[解決済み] Bash関数にパラメータを渡す
-
[解決済み] JavaScriptの関数への引数の数
-
[解決済み] オプションの引数を持つPython関数を作成するにはどうしたらいいですか?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Notice: 非オブジェクトのプロパティを取得しようとしているエラー
-
[解決済み】phpのob_start()の使い道は?
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】SSLピア証明書またはSSHリモートキーがOKでなかった
-
[解決済み】/var/www/htmlとは何ですか?[クローズド]
-
[解決済み] Uncaught SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
thinkphp5 timestamp 非整形の数値に遭遇した。
-
phpのAllowed memory size of 134217728 bytes枯渇問題の解決法
-
[解決済み】警告: file_get_contents(): https:// ラッパーがサーバー構成ですべて無効になっています。