はじめに
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'));
}
}
この例だと $method
に new
か update
以外が来てしまうと死ぬのですが、そんなのが来そうなときは 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で開発している方はこちらの方法のほうがいいですよ!