LoginSignup
1
1

More than 1 year has passed since last update.

イケてないswitch-case文からおさらばするPHP生活の知恵

Last updated at Posted at 2020-05-29

はじめに

PHPの等価比較がゆるふわなことにお悩みのぺちぱーのみなさまこんにちは。
PHPのswitch-case文が「緩やかな比較」であることは有名ですが、なるべくならいつも厳密に比較したい諸兄にはツラい現実を投げかけてきていると思います。

イケてない例

たとえば、Laravel案件とかでこんな処理を見かけることがあると思います。

class HogeController {

    public function fuga($method){
        $title = '';

        switch($method){
            case 'new':
                $title = '新規作成';
                break;
            case 'update':
                $title = '更新';
                break;
        }

        return view('fuga', compact('title'));
    }

}

きっとルートパラメータで来た文字列でタイトル出し分けたいんでしょう。
こんなことでswitch分岐させる?みたいな微妙に気分になりますね。
もうちょっと違う方法でできそうな気がしますよね。

連想配列を使ってみよう

これくらいだったら連想配列で行けそうですよね。いちいち真偽判定しない分、こちらの方がパフォーマンスが良いと言われています。(ベンチマークは各々やってくだせえ)

class HogeController
{
    public function fuga($method)
    {
        $title = [
            'new' => '新規作成',
            'update' => '更新'
        ][$method];

        return view('fuga', compact('title'));
    }
}

この例だと $methodnewupdate 以外が来てしまうと死ぬのですが、そんなのが来そうなときは array_key_exists() でチェックすると良いでしょう。

こんな感じ。

class HogeController
{
    public function fuga($method)
    {
        $title_list = [
            'new' => '新規作成',
            'update' => '更新'
        ];

        $title = (array_key_exists($method, $title_list))
            ? $title_list[$method]
            : '';

        return view('fuga', compact('title'));
    }
}

@tadsan からphp7.1以降ならこう書けるよっていうコメントいただきました!
ちょっとmatch式っぽいですね(続編へのフリ

class HogeController
{
    public function fuga($method)
    {
        $title_list = [
            'new' => '新規作成',
            'update' => '更新'
        ][$method] ?? '';

        return view('fuga', compact('title'));
    }
}

PHP8で開発している方はこちらの方法のほうがいいですよ!

1
1
3

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
1
1