switch文の使いどころの悩み

  • 32
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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)) {
  //...
}