ワイ「タイプヒントしただけなのに、、、」

Laravel Advent Calendar 2022　11日目の投稿です。
頭空っぽで読めると思います。

# ある日の仕事中
YouTube　「ーーー！ーーーーーー！」
ワイ　「やっぱYouTubeは最大の娯楽やな！ガハハ！」
先輩　「ワイくん、ちょっといいかな？」
ワイ　（ビクッ！
ワイ　「もちろんです！」(ｼｮｰﾄｶｯﾄﾎﾟﾁｰ
先輩　「実は改修をしたい部分があって」
先輩　「このメール送信の部分なんだけど、、、」
先輩　「かくかくしかじかで、、、」
先輩　「今お願いできそうなのがワイくんしかいないんだけど」
先輩　「お願いできるかな？」
ワイ　「任せてください！」
先輩　「じゃあどれくらいで終わりそうか見積もりができたら教えてくれるかな？」
ワイ　「はい！」


# 一時間後
YouTube　「ーーー！ーーーーーー！」
ワイ　「やっぱYouTubeは最大の娯楽やな！ガハハ！」
ワイ　「、、、！」
ワイ　「そういえば見積もりを依頼されてたんやった」
ワイ　「しゃーない、続きは見積もりが終わってからやな」
ワイ　「確かメールの処理って言っとったからこの辺やろか」ﾎﾟﾁｰ

# さらに一時間後
ワイ　「見積もりする為に調べてただけやのに改修まで終わってしもた」
ワイ　「動作確認は、、、」
ワイ　「ばっちりや、、、！」
ワイ　「ワイ天才かも知れへんなぁ」
ワイ　「ん？」
ワイ　「この部分PHPDOCで型を書いてあるみたいやけど」
ワイ　「確かPHP７.4からクラス内のプロパティはタイプヒントできたような気がするなぁ」
ワイ　「せや！こんな時はPHPのマニュアルや！」
ワイ　「後輩くんも見た方がええって言っとったし見てみるか」


>型宣言 ¶
関数のパラメータや戻り値、 クラスのプロパティ (PHP 7.4.0 以降) に対して型を宣言することができます。 これによって、その値が特定の型であることを保証できます。 その型でない場合は、TypeError がスローされます。

ワイ　「ふむふむ」
ワイ　「ワイの記憶通り、7.4からタイプヒントが出来そうやな」
ワイ　「PHPのバージョンは、、、7.4や！」
ワイ　「よし、タイプヒントしたろ！」


```diff_php
      /**
       * @var \App\Models\User
       */
-     public $user;
+     public Models\User $user;

```

ワイ　「ふぅ、、、」
ワイ　「一仕事終えたわ、、、」
ワイ　「これで`$user`に指定した型以外がプロパティに代入されるとエラーが発生するようになって安全やな！」
ワイ　「やっぱりちょっとしたことでも改善活動は大事やな」
ワイ　「みんなの為にもなるし、自分の行動がみんなの為になると思うとモチベ上がるわ」
ワイ　「git add .」(ｶﾀｶﾀ
ワイ　「git commit -m "ワイの天才的リファクタリング"」（ｶﾀｶﾀｶﾀﾀﾀﾀ
ワイ　「git push origin head」(ｯﾀｰﾝ！！！！！！
ワイ　「ふぅ、、、」
ワイ　「またワイの天才コミットが生まれてしまったで」
ワイ　「あ、動作確認するの忘れとった、、、」
ワイ　「タイプヒントしただけやし大丈夫やろ」
ワイ　「これだけでエラー出たら逆にびっくりやで」
ワイ　「PR作ってレビュー依頼もしとくか」

# 一時間後
YouTube　「ーーー！ーーーーーー！」
ワイ　「やっぱYouTubeは最大の娯楽やな！ガハハ！」
ワイ　「はっ、、、！」
ワイ　「見積もり終わったの報告するの忘れとった、、、」
ワイ　「先輩、今大丈夫でしょか、、、？」
先輩　「あっ、ちょっと待ってね、、、OK」
先輩　「ワイくんどうかした？」
ワイ　「さっきの改修の見積もりの件なんですが」
ワイ　「ちょっと調べてたらそのまま改修終わっちゃいました」
ワイ　「今レビュー依頼出しているのでレビュー終わったら反映できます」
先輩　「本当！？助かるよ！」
先輩　「反映したらまた連絡お願い！」
ワイ　「かしこまりました」

# 自席ワイ
ワイ　「おっ、レビューapproveされとるな」
ワイ　「今日はマージして仕事終了やな」
ワイ　「このPRをマージして、、、」
ワイ　「メールの改修をマージしました、少ししたら反映されると思います、、、っと」(ｶﾀｶﾀｶﾀ
ワイ　「よし、これで仕事終わりや！」
ワイ　「YouTubeでもみるか」(ﾎﾟﾁｰ

# 翌日
YouTube　「ーーー！ーーーーーー！」
ワイ　「やっぱYouTubeは最大の娯楽やな！ガハハ！」
先輩　「ワイくん、ちょっといいかな、、、？」
ワイ　（ビクッ！
ワイ　「もちろんです！」(ｼｮｰﾄｶｯﾄﾎﾟﾁｰ
先輩　（いつもこの流れだな
先輩　「昨日昨日改修して貰ったメール送信なんだけど」
先輩　「なんかエラーが出て動作しないみたいなんだ」
先輩　「確認してもらえるかな？」
ワイ　「ファッ！？」
ワイ　「すぐ確認します！」

# 先輩が去った後
ワイ　「昨日ちゃんと動作確認したはずやけどな、、、」
ワイ　「どうせワイがマージした後に誰かが壊したんやろ、、、」
ワイ　「ま、見てみるか、、、」
ワイ　「」(ﾎﾟﾁﾎﾟﾁ
ワイ　「」（ﾒｰﾙ送信ﾎﾟﾁｰ
ワイ　「、、、ファッ！？」
ワイ　「ホンマにエラー出とるやんけ、、、」
ワイ　「なになに、、、？」

>Using Typed properties classes on SerializesModels causes error due Illuminate\Contracts\Database\ModelIdentifier

ワイ　「なんやこれ、、、」
ワイ　「ワイは英語苦手なんやで、、、」
ワイ　「せや！困った時は後輩くんや！」
ワイ　「後輩くん！今良いかな？」
後輩　「ワイ先輩？どうかしましたか？」(ｶﾀｶﾀ
ワイ　「実はな、エラーが発生してて困っとるんや、、、」
後輩　「またですか、、、」
後輩　「エラー見せてください」
ワイ　「これやで」

>Using Typed properties classes on SerializesModels causes error due Illuminate\Contracts\Database\ModelIdentifier

後輩　「SerializeModels でタイプヒントされたプロパティを使用するとIlluminate\Contracts\Database\ModelIdentifierでエラーが発生する、、、って書いてありますね」
ワイ　「ググってもよくわからんかったんや」
後輩　「ググったら一番最初に[これ](https://github.com/laravel/framework/issues/30494)が出てきますね」
後輩　「このissueは見ましたか？」
ワイ　「ん？」
ワイ　「見てへんで？」
後輩　「どうしてですか？」
ワイ　「英語やからちょっと抵抗感あってな、、、」
後輩　「完全に理解する必要はないので、翻訳しながらでも見るようにした方が良いですよ？」
後輩　「こういうissueは大体読めば解決することも多いので」
ワイ　「後輩くんが言うなら次からはそうするわ！」
ワイ　「でissueにはなんて書いてあるんや？」
後輩　「はぁ、、、今回だけですよ？」
後輩　「PHPのバージョンが7.4、Laravelのバージョンが6.4.1で発生しているみたいですね」
後輩　「$userが型付きプロパティなので、キューがプロパティをシリアライズできなくて困ってるって書いてあります」
ワイ　「ほうほう」
ワイ　「つまり？」
後輩　「シリアライズ可能なクラスは、モデルやコレクションを扱うために」
後輩　「`\Illuminate\Contracts\Database\ModelIdentifier`をプロキシオブジェクトとして使っています」
後輩　「理由はモデルが複雑だったりデータベースとの接続を持っている為です」
後輩　「その為そのままだと簡単にシリアライズできないので、プロキシオブジェクトが使われます」
後輩　「ざっくりですがこんな感じで書いてありますね」
ワイ　「うーん、つまりどう言うことや？」
後輩　「今回の例で言うと、タイプヒントされているプロパティに一時的に違うクラスのインスタンスが入るからエラーが発生したって感じですね」
ワイ　「そうなんか、、、」
ワイ　「タイプヒント追加しただけでエラーが発生するなんて驚きやな！」
後輩　「そうですね」
後輩　「でも動作確認していれば気付けるはずなので問題ないですね」
ワイ　「そ、そうやな、、、」
ワイ　「動作確認せんやつなんておらへんやろ、、、」
後輩　「そうですよね」
後輩　「自分で実装した部分の動作確認をしないなんて無責任ですよね」
ワイ　「」(ﾋﾞｸｯ
ワイ　「でも、忙しくて忘れてしまってしまったってこともあるんやないか、、、？」
後輩　「そうですね、、、」
ワイ　「ままええわ！」
ワイ　「今回はホント助かったやで〜」
ワイ　「また困った時は頼むで？」
後輩　「はい、、、」


# そして時は経ち、、、
ワイ　「先輩」
ワイ　「メールのエラーの件ですが原因わかったんで修正しました！」
先輩　「助かるよ」
先輩　「原因はなんだったんだい？」
ワイ　「詳しくは[このissue](https://github.com/laravel/framework/issues/30494)に書いてあるんで見てくださいやで」
先輩　「おお、ありがとう」
先輩　「ワイくん英語苦手って言ってたけど内容理解できたの？」
ワイ　「ワイにかかれば朝飯前ですわ」
先輩　「ワイくんも成長しているね」
先輩　「これからも頼むよ」
ワイ　「任せてくださいやで！」

# まとめ
ワイ　「タイプヒントしただけでエラーになることもあるんやな、、、」
ワイ　「どんなに小さい修正でも動作確認を怠るとアカンってことがわかったわ」
ワイ　「それと英語で書かれているissueでも根気強く読むのが大切ってことやな」
ワイ　「、、、あっ！」
ワイ　「そろそろ〇〇ちゃんの配信が始まるんやった！」(ﾎﾟﾁｰ
YouTube　「ーーー！ーーーーーー！」
ワイ　「やっぱYouTubeは最大の娯楽やな！ガハハ！」
(完)

# ホントのまとめ
@Yametaro さんのワイ記法で書いてみました。
セリフ形式で書いているとワイの部分と自分が強く出てしまっている部分があったりして、二重人格みたいになってしまってるような気がします。笑

タイプヒントだけでエラーが発生するとは思わなかったので原因がわかった時は驚きました。
検索した時に英語で書かれたissueとかがヒットする場合は、わからない単語が多くて時間がかかりそうでも翻訳しながら読む方が自分の経験的にも一番早く解決すると思っています。

動作確認大事