おぼえがき

過ちては則ち改むるにうんぬんかんぬん

switch文について(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1におけるswitch文について。

<?php

//①switch文で置き換えることのできるif文
echo '数字でメニューを選んでください(1.ステーキ, 2.ピロシキ , 3.ずんだ餅) >';
$food = (int)trim(fgets(STDIN));  //str型の半角数字の返り値をint型に型キャスト

if ($food === 1) {
  echo 'ご注文はステーキですね。';  //1===1にtrueで出力
elseif ($food === 2) {
  echo 'ご注文はピロシキですね。';  //2===2にtrueで出力
elseif ($food === 3) {
  echo 'ご注文はずんだ餅ですね。';  //3===3にtrueで出力
}


//②①をswitch文で置き換えたパターン
$food2 = trim(fgets(STDIN));

switch ($food2) {
  case 1:
    echo 'ご注文はステーキですね。';  //1==1にtrueで出力
  break;                              //プログラムの終了
  case 2:
    echo 'ご注文はピロシキですね。';  //2==2にtrueで出力
  break;                              //プログラムの終了
  case 3:
    echo 'ご注文はずんだ餅ですね。';  //3==3にtrueで出力
  break;                              //プログラムの終了
}

switch文は、if文の条件式==の繰り返しを別パターンで記述する方法です。

 

上記①のプログラムは条件式が===なので、$foodの値をint型に型キャストしなければtrueにはなりません。

しかし②のswitch文では条件式が==になりますので、$food2の値をint型に型キャストしなくても、1か2か3が入力された場合はその数字に対応したcaseの処理がおこなわれます。

 

 

switch文の定形は以下のとおりです。

 

switch (引数) {
    case 1:
        おこないたい処理;
    break:
    case 2:
        おこないたい処理;
    break:
    case 3:
        おこないたい処理;
    break:
}

 

 

引数の部分には「〇〇 == caseに指定した整数」の○○に該当する値を指定します。

 

case 1: は if (引数 == 1) の条件式と同じです。

この条件式がtrueになったときに、breakよりも上の行に記述されている処理をすべておこないます。

 

 

ちなみに、switch文においてbreakは各caseに必須の記述ではありません。

たとえば上の定形のコードからcase1のbreakを削除すると、引数に2または3が入ったときは今までどおり問題なくプログラムは処理されます。

 

しかし1が入力されてしまうと、case1だけでなくcase2の処理まで実行されてしまいます。

なぜこうなるのかというと、プログラムを終了するbreakがcase2の最下段までいかないと存在しないからです。

 

breakを記述しなくてもswitch文は正常に動作してくれますが、このような挙動になることは覚えておいたほうがいいでしょう。

 

 

以上です。