web系エンジニアを目指し、MENTAを利用し、PHPを学習している初学者です。
日々学習していることの忘備録、モチベ維持、ちゃんとやってることの証明!で、投稿していきます。
#対象者
PHPを学びはじめた、初学者
#内容
関数で引数の初期値を設定した際の、値の扱い
#動作環境
PHP 7.1.32
##基本のおさらい
###関数・引数とは
$a = 1;
$b = 2;
$c = 3;
//仮定:組み合わせごとの和を求めたい
$ab = $a + $b; //3
$ac = $a + $c; //4
$bc = $b + $c; //5
//関数にする
function sum($number1, $number2) {
$sum = $number1 + $number2;
return $sum;
}
関数:上記の4行
引数:関数に渡す/受け取る値($number1, $number2)
//関数を使用する
$ab = sum($a, $b); //3
$ac = sum($a, $c); //4
$bc = sum($b, $c); //5
ここまでは簡単!
#これが本題!
関数はとても便利(=使いこなさなきゃダメ)で、メンターさんから、
「それ、関数にしてみましょう。」
「その処理は、関数にすればコードがスッキリしますよ。」
と指摘をもらい、どんどん関数化していきます。
今回書きたいのは、関数を量産する内に知った、
引数の初期値を設定した関数を呼び出す際、
引数を渡さないと、初期値が代入され、
引数を渡すと、そちらが代入される。
つまり優先度は初期値 < 引数である。
文章だとわかりづらいですが、例を見れば簡単です!
//初期値を設定した関数
function sum($a=5, $b=10) {
$sum = $a + $b;
return $sum;
}
//呼び出し方で結果が変わる
$case1 = sum(); //15 (=5+10)
$case2 = sum(1, 2); //3 (=1+2)
$case3 = sum(1); //11 (=1+10)
引数を渡さないと、初期値が代入され・・
$case1 = sum(); //15 (=5+10)
引数を渡すと、そちらが代入される・・
$case2 = sum(1, 2); //3 (=1+2)
おまけ:引数を1つだけ指定した場合、(引数、初期値)で代入される・・
$case3 = sum(1); //11 (=1+10)
以上、簡単でしたね!
「・・・だから?」
「これ、何の役に立つの?」
そんな初学者の方向けに、実例を出して終了します。
#役に立った実例
「〜ゲームを作成せよ」
というような課題で、「すぐ終わったらつまらない」と思い、**「3ポイント先取」**として、作成開始。
勝利数を保持するのに詰まってしまった時に、メンターさんからアドバイスをもらいました。
//ゲーム関数
function game($victory = 0, $com_victory = 0) {
//ゲーム実行
//プレイヤーが勝利すれば、$victory++
//COMが勝利すれば、$com_victory++
//どちらかが「3」に達していたら、終了
//達していなければ、再度ゲーム関数呼び出し(いわゆる、再帰関数!)
}
「ゲーム関数を呼び出すたびに$victory,$com_victoryが0
になって、永遠にゲームをやめられないのでは」
「でもメンターさんがこんな間違えをするはずない・・」
と調べる内に、初期値の優先度を理解して納得。
//ゲーム関数を、最初に呼び出す場合
game();
//再帰関数として呼び出す場合
game($victory, $com_victory);
こうすることで、最初に呼び出す時は初期値(勝利数=0)が適用され、
再帰関数で呼び出す時は、それぞれの勝利数が引き継がれ、
「3ポイント先取」を実現出来ましたとさ。
ちゃんちゃん。