PHPのswitch文は悪名高い==
演算子による比較を行うので、気を付けて使わないとバグを埋め込みやすい。
<?php
switch (true) {
case 0:
echo '数字の0';
break;
case '0':
echo '文字列の0';
break;
case '0.0':
echo '文字列の0.0';
break;
case true:
echo '真偽値のtrue';
break;
}
↑は文字列の0.0
を出力する。PHPを知らない人が見たらPHP嫌いになると思う。
なので、基本的にはswitchは使わないようにして、使いたくなるような場面があれば、連想配列を使って辞書を作るか、命名規則をうまく作って可変関数にするか、ポリモーフィズムで解決するか考えた方がいい。
ただ、個人的には、OR条件文の代替としてswitch文を使うことがたまにある。比較対象の変数の型が固定であれば…まあ何とか使えるだろうか。
<?php
if ($_GET['hoge'] === 'foo' || $_GET['hoge'] === 'moo' || $_GET['hoge'] === 'soo') {
//...
} elseif ($_GET['hoge'] === 'baa' || $_GET['hoge'] === 'buu') {
//...
}
↑を↓みたいに書く。ちょっとすっきりする。
<?php
switch ($_GET['hoge']) {
case 'foo': case 'moo': case 'soo':
//...
break;
case 'baa': case 'buu':
//...
break;
}
in_array()を使う方法もある。in_arrayなら===
による比較をオプションとして指定できるので、安全かもしれない。
<?php
if (in_array($_GET['hoge'], ['foo', 'moo', 'soo'], true)) {
//...
} elseif (in_array($_GET['hoge'], ['baa', 'buu'], true)) {
//...
}