LoginSignup
32
29

More than 5 years have passed since last update.

switch文の使いどころの悩み

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
29