PHPのswitch文で条件分岐の式を書くときの注意点
今回はPHPのswitch文で条件分岐の式を書くときの注意点についてご紹介いたします。
PHPのswitch文で条件分岐の式を書くときの注意点
PHPのswitch文ではある条件に対して完全一致で処理を分けたいときに使われますが、条件分岐の式でも処理を分けることが可能です。
しかし、PHPのswitch文で条件分岐の式を書くときに一箇所ハマった点があります。
例えば、ある点数について60点以上で"合格"、40点~60点で"もうひと踏ん張り"、20点~40点で"頑張ろう"、20点未満で"赤点"を出力したいとします。
この条件に対して、私は下記のswitch文で書いていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
switch($test){ case $test >= 60: print('合格'); break; case $test >= 40: print('もうひと踏ん張り'); break; case $test >= 20: print('頑張ろう'); break; default: print('赤点'); break; } |
一見これで良さそうに見えますが、実はこの処理には落とし穴があるのです。
例として、$testの値が0だと、この処理ではdefaultに処理がいって’赤点’が出力されてしまいます。
なぜ$testの値が0だと’赤点’が出力されてしまうかというと、PHPの特性として、変数の中身がnullか0の場合は、真偽値がfalseとなります。
switchは本来完全一致のときで処理を分けたいときに使われます。
switchで囲った中身について、$testの値が0以外だと上から順にcaseの値がtrueになったときにcaseの中の処理が実行されますが、$testの値が0の場合は上から順にcaseの値がfalseになったときにcaseの中の処理が実行されてしまうのです。
つまり$testの値が0のときは上から順にcaseの値がfalseになったとき、すなわち、「$test >= 60」がfalseなので「print('合格’);」が実行されてしまうのです。
これを避けるためには、switch文本来の使い方とは異なりますが、下記のソースコードに変える必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
switch(true){ case $test >= 60: print('合格'); break; case $test >= 40: print('もうひと踏ん張り'); break; case $test >= 20: print('頑張ろう'); break; default: print('赤点'); break; } |
一部の界隈ではこの書き方が浸透しているようです。
ただ、この書き方は物議をかもしているらしいですね。
終わりに
今回はPHPのswitch文で条件分岐の式を書くときの注意点についてご紹介いたしました。
ディスカッション
コメント一覧
まだ、コメントがありません