2
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

【PHP】引数の初期値を設定した関数|優先度(初期値 < 引数)

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になって、永遠にゲームをやめられないのでは:scream:
「でもメンターさんがこんな間違えをするはずない・・」
と調べる内に、初期値の優先度を理解して納得。

//ゲーム関数を、最初に呼び出す場合
game();
//再帰関数として呼び出す場合
game($victory, $com_victory);

こうすることで、最初に呼び出す時は初期値(勝利数=0)が適用され、
再帰関数で呼び出す時は、それぞれの勝利数が引き継がれ、
「3ポイント先取」を実現出来ましたとさ。
ちゃんちゃん。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?