環境
- windows10
- DockerDesktop for Win 3.5.x
- Laravel 8.x
- PHP 8.x
- VsCode
- gitbash 2.32.0.1
本題
一例
以下のコードは一見、"それは0です"と出力されそうな感じですが、結果は"それは2より大きいです"と出力されます。
理由は以下の通りです。
- swich文のcaseでの比較は==相当なので、0 == falseという扱いになります
- 上記前提により、結果として、$xがfalseと等価になるcase文の処理が実行されることになります
- よって最初にcase文がfalseとなるcase $x >= 2の処理が実行され、"それは2より大きいです"が出力されます
$x = 0;
switch ($x) {
case $x >= 2 :
var_dump("それは2より大きいです");
break;
case $x >= 1 :
var_dump("それは1より大きいです");
break;
case $x === 0 :
var_dump("それは0です");
break;
default:
var_dump("不明");
break;
}
一般的なcaseの書き方
比較演算子を使用しない場合は単純に$xの値が2に該当するブロックの処理が実行されるので、問題ありません。
$x = 2;
switch ($x) {
case 2 :
// 処理
break;
/// 続く
caseで比較演算子を使用する場合の書き方
一方、比較演算子を使用する場合は、以下のようにswitch(true)と書く必要があります。
$x = 2;
switch (true) {
case $x < 3 :
// 処理
break;
/// 続く
冒頭の例に当てはめてみると以下のようになります。
switch (true) {
case $x >= 2 :
var_dump("それは2より大きいです");
break;
case $x >= 1 :
var_dump("それは1より大きいです");
break;
case $x >= 0 :
var_dump("それは0です");
break;
default:
var_dump("不明");
break;
}
PHP 型の比較表はこちら
https://www.php.net/manual/ja/types.comparisons.php
ということで、データ型の付与と厳密な比較はこういった場面で重要になってくるので、自戒の念を込めて意識していきたいと思います。
まとめ
いかがでしたでしょうか。本記事では、PHPにおけるswitch分のcaseで比較演算子を使用する際の注意点について紹介しています。私自身がこの仕様に引っ掛かってしまったため、同じ境遇のどなたかの役に立てが幸いです。