Share
Embed
Transcript
29 slides
-
自己紹介 勝佐 拓也(かつさ たくや) BABY JOB 株式会社(2023 年 2 月入社)
保育園探し 「えんさがそっ♪」 の 開発・保守 バックエンドエンジニア 3 年 筋トレ大好き / ニコニコ大好き 3歳になる娘がいます PHPカンファレンス関西のスタッフやってました!! 2 @kitkattsun0531 -
まっち ちゃん のキャラクター紹介 • PHP 8 から参戦! • 計算が好き ◦
問題を渡すと、答えを返してくれる • シンプルなことが好き ◦ 他のケースは見ない ◦ 複雑な作業は嫌い • キッチリ決めたい性格 ◦ 厳密に値(===)を比較する ◦ 条件に合わない場合はエラーになる マッチは、いかが。 ライターなんてもう古い。 -
すいっち くん のキャラクター紹介 • PHP 4 から参戦! • 協力プレーが好き ◦
他の式や文と協力して、アクションする • 複雑なことが好き ◦ 他のケースも見る • 細かいところは気にしない性格 ◦ 値を緩やかに(==)比較する ◦ 条件に合わない場合はエラーにならない やる気スイッチ 僕のはどこにあるんだろ〜♪ -
まっち $description = match ($service) { 'ensagaso' => '保育園・幼稚園探しサイト', 'tebura'
=> 'おむつを保育施設に届けるサブスク', default => 'その他' }; すいっち switch ($service) { case 'ensagaso': $description = '保育園・幼稚園探しサイト'; break; case 'tebura': $description = 'おむつを保育施設に届けるサブスク'; break; default: $description = 'その他'; } -
まっち • 記述量が少ない • 値が厳密比較される $description = match ($service) {
'ensagaso' => '保育園・幼稚園探しサイト', 'tebura' => 'おむつを保育施設に届けるサブスク', default => 'その他' }; -
すいっち • 記述量が多い • 値が緩やかに(==)比較される switch ($service) { case 'ensagaso':
$description = '保育園・幼稚園探しサイト'; break; case 'tebura': $description = 'おむつを保育施設に届けるサブスク'; break; default: $description = 'その他'; } -
$service = match ($sellingPoint) { 'おむつ', '食事用エプロン・手口ふき ' => '手ぶら登園',
'口コミ', '見学予約' => 'えんさがそっ♪', default => 'その他' }; switch ($sellingPoint) { case 'おむつ': case '食事用エプロン・手口ふき ': $service = '手ぶら登園'; break; case '口コミ': case '見学予約': $service = 'えんさがそっ♪'; break; default: $service = 'その他'; break; } まっち すいっち -
• 記述量が少ない • 複数条件にできる ※複雑な条件式は可読性が悪くなる • 値が厳密比較される まっち $service =
match ($sellingPoint) { 'おむつ', '食事用エプロン・手口ふき ' => '手ぶら登園', '口コミ', '見学予約' => 'えんさがそっ♪', default => 'その他' }; -
• 記述量が多い • case 内で複数条件の指定ができないが、 case で分けることで実現できる • 値が緩やかに(==)比較される すいっち
switch ($sellingPoint) { case 'おむつ': case '食事用エプロン・手口ふき ': $service = '手ぶら登園'; break; case '口コミ': case '見学予約': $service = 'えんさがそっ♪'; break; default: $service = 'その他'; break; } -
$song = match ($event) { 'クリスマス' => function() { //
曲を検索する処理があって ... return 'あわてんぼうのサンタクロース '; }, 'ひな祭り' => function() { // 曲を検索する処理があって ... return 'うれしいひなまつり'; }, default => function() { /// 曲を検索する処理があって ... return '該当なし'; }, }; switch ($event) { case 'クリスマス': // 曲を検索する処理があって ... $song = 'あわてんぼうのサンタクロース '; break; case 'ひな祭り': // 曲を検索する処理があって ... $song = 'うれしいひなまつり'; break; default: // 曲を検索する処理があって ... $song = '該当なし'; } まっち すいっち -
• 記述量は多い • 原則、返却式は複数行で書けないので、 無名関数などを使う必要がある ※ あまり適切な使い方ではなさそう • 値が厳密比較される $song
= match ($event) { 'クリスマス' => function() { // 曲を検索する処理があって ... return 'あわてんぼうのサンタクロース '; }, 'ひな祭り' => function() { // 曲を検索する処理があって ... return 'うれしいひなまつり'; }, default => function() { /// 曲を検索する処理があって ... return '該当なし'; }, }; まっち -
• 記述量は少ない • 複数行で処理できる • 複雑な処理も書きやすい • 値が緩やかに(==)比較される すいっち switch
($event) { case 'クリスマス': // 曲を検索する処理があって ... $song = 'あわてんぼうのサンタクロース '; break; case 'ひな祭り': // 曲を検索する処理があって ... $song = 'うれしいひなまつり'; break; default: // 曲を検索する処理があって ... $song = '該当なし'; } -
match式は PHP 8 未満で 使えない とはいえ PHP は 8.0 まで
サポート切れてるんですけどね (煽り) -
こんな処理があったとします match 式 で書きづらいし、 switch 文でもしっくりこないな〜 うーん、もやもや... readonly class Audience
{ public string $name; public string $timeSignal; public function __construct(string $keyword) { switch ($keyword) { case 'niconico': $this->name = 'ニコニコ動画'; $this->timeSignal = 'ドワンゴが午前2時くらいをお知らせします '; break; case 'youtube'... } } // 表示するためのメソッド ... } public function showName(): string { return 'サービス名:' . $this->name; } public function showTimeSignal(): string { return '時報:' . $this->timeSignal; } -
ストラテジーパターンもいいよね!! StreamingInterface を実装した それぞれの動画配信クラス ( Niconico など ) を活用できる 条件追加漏れを防げるかも!
interface StreamingInterface { public function name(): string; public function timeSignal(): string; } class Niconico implements StreamingInterface { public function name(): string { return 'ニコニコ動画'; } public function timeSignal(): string { return 'ドワンゴが午前2時くらいをお知らせします '; } } すとらちゃん ふっ… ふつくしいっ…! -
readonly class Audience { public function __construct( private StreamingInterface $streaming
) { } public function showName(): string { return 'サービス名:' . $this->streaming->name(); } public function showTimeSignal(): string { return '時報:' . $this->streaming->timeSignal(); } } コンストラクタに (例えば) Niconico を渡すことで実現できる 処理を「外部にカプセル化」 することで、 処理を実行する / 利用するを 分けることができる readonly class は PHP8.2で導入された よね〜 ストラテジーパターンもいいよね!!