今回はPHPのメソッドで引数が無い場合に初期(デフォルト)値を入れる方法を調べます!
初期値設定できるなんて...便利...!
メソッドで初期値を設定する
さて、それでは早速みていきましょう。
とはいっても、そんなに難しくは無いです。
さて、まずはいつも通りマニュアルをみてみます。
ふむ。
もう答え書いてありますね。
function makecoffee($type = "cappuccino")
{
return "Making a cup of $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
// 出力
Making a cup of cappuccino.
Making a cup of .
Making a cup of espresso.
上記のマニュアル記載の例を見ると、makecoffee関数の引数に$type
が渡されているようですが、そこに加えて代入のようなものが入っていますね...!
そう、このようにすれば引数が渡されなかった場合にその値が入ってくれるんです!
最初のMaking a cup of cappuccino
が出力されている箇所はecho makecoffee();
となっており、引数が渡されていません。
その場合、あらかじめ用意したcappuccino
が入るわけです。
また、null
が渡された場合はnull
という値が渡されるので、デフォルトではなく、null
が使われるわけです。
ちゃんと値が渡されたらもちろん、その値を使用することができるようになっています。
今までやってきてこの書き方をみたことがなかったので、最初みた時は...
"え?なにこれ?wこの引数どんな値渡ってきてもすぐ代入したら意味ないやんw”
ってなりましたよ...w
デフォルト値の応用
デフォルト値にはスカラー型(boolean, integer, float, double, string)以外の値も設定することができます。
他にある型...例えばArray型などがありますね。
実際に触ってもらうのがいいですね。
こちらも公式マニュアルから引っ張ってきたままです。
みてもらえるとわかりますが、makecoffee関数の第一引数には配列が、そして第二引数にはNULLがデフォルトとして与えられています。
この状態で引数を全く渡さずに関数を実行すると...
確かにデフォルト値が入り、$types
のcappccino
が表示され、$coffeMaker
の方はNULL
が入り、その直後の$device
への代入$coffeeMaker
がNULL
だったらhands
を、そうでなければそのまま(引数の値)で表示させていますね。
また、引数に値を渡すと今度はその配列の分だけちゃんと表示されたり、NULL
ではなく、ちゃんと引数が表示されているのがわかります。
このように、引数にはスカラー型だけではなく、Array型やNULLなども使用することができるんです!
デフォルト値を使用する時に気をつけるべきこと
はい、それでは次にデフォルト値を使う場合に気をつけなければいけないことをお伝えします。
とはいっても、こちらも公式マニュアルに書いてあることですが...。
もしもデフォルト値を使う場合、他の引数でデフォルト値を使わないものがあったら、その引数を先に受け取るようにしなければいけません。
hoge($a,$b,$c = 'hoge') // OK
hoge($a = 'hoge',$b,$c) // NG
// なぜNG?
hoge('input for b','input for c'); // bのための値がaの値として入ってしまう。
もしもデフォルト値があるものが先にきていた場合、上記のように第二、第三引数にデフォルト値がないものがあるわけですが、その後hoge関数を呼び出した場合、'input for b'
は$b
のために用意した値ですが、$a
はあくまでデフォルト値、引数があれば最初のものは$a
の引数として認識されてしまうわけですね...
そのため、そこには注意が必要です。
重要なことは"初期値のない引数が先、初期値がある引数は後"です。
また、これは個人的に思うんですが、引数の数が多く、さらにデフォルト値を全てに設定してしまうと、可読性が損なわれる気もします...
できれば引数はデフォルト値をつけずに運用できる方法をさがしてみて、どうしようもないならがっつり使っちゃいましょう!
便利だからって使いすぎには注意です...(正直使われているのを滅多にみません....
まとめ
さて、というわけで、今回はPHPのメソッドの引数にデフォルト値を設定する方法を調べてみました!
PHPマニュアル読むのが楽しい...!
デフォルト値つけれる言語って意外と少ない気が...(してないだけでできるかもですが...
デフォルト値が設定できる言語他にもあるのかなぁ・・・?
知ってたらぜひコメントをっ!w
ではでは!