Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPカンファレンス関西202402 nullsafe演算子を使おう〜if文地獄からの開放〜
Search
Nakamigawa
February 11, 2024
0
250
PHPカンファレンス関西202402 nullsafe演算子を使おう〜if文地獄からの開放〜
Nakamigawa
February 11, 2024
Tweet
Share
More Decks by Nakamigawa
See All by Nakamigawa
宅配クリーニングサービス「Lenet」開発におけるDDD7年の歩み
nakamigawa
0
2.5k
null判定をis_nullでしてたけど止めた話
nakamigawa
0
290
クレジットマスターとの戦い
nakamigawa
0
1.2k
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
What's new in Ruby 2.0
geeforr
343
31k
Raft: Consensus for Rubyists
vanstee
136
6.6k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Done Done
chrislema
181
16k
The Invisible Side of Design
smashingmag
298
50k
Writing Fast Ruby
sferik
627
61k
Designing for humans not robots
tammielis
250
25k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Transcript
nullsafe演算子を使おう 〜if文地獄からの開放〜 PHPカンファレンス関西2024/02/11 仲見川勝人@NakMeKtt
- 仲見川 勝人(@NakMeKtt) - 職業 - Software Engineer - Mobile
App, Front End, Server Side - 所属 - 株式会社ホワイトプラス - 宅配クリーニング「リネット」の開発 - Tech lead - アプリ開発G Engineering Manager 自己紹介 2 好きな技術領域 - Flutter, Android - サーバーサイド(PHP, Go) 好きなクラウドサービス - CloudRun、S3 好きなもの - ソーセージ、映画、アニメ、FF14、 新しい技術
みなさんnullチェックしてますか? 3
PHP8.0〜使ってますか? 4
nullsafe演算子使ってますか? $obj?->method() 5
nullsafe演算子はPHP8.0より導入され、プロパティやメソッ ドにアクセスするアロー演算子(->)を拡張したものです。 PHPドキュメントには以下のように記載されています 6
オブジェクトが null と評価された場合に、例外はスローされず、 null が返される点だけが異なります。 従来のアロー演算子は変数がnullであった場合、プロパティや メソッドが存在しないためエラーとなっていました。 nullsafe演算子はエラー(例外)を発生させずにnullが返るよ うになっています。 7
アロー演算子の例 実行結果 8 上記コードは3V4Lで試せます:https://3v4l.org/1nGrb
nullsafe演算子の例 実行結果 9 上記コードは3V4Lで試せます:https://3v4l.org/iiuuM ※エラー無し
オブジェクトの評価がチェインの一部だった場合は、 残りのチェイ ンはスキップされます。 ここがnullsafe演算子の非常に強力な所で、従来だとnullable の変数に対してメソッド呼び出しを行う場合is_nullなどで nullチェックが必要だったために、メソッドチェーンが書けま せんでした。 10
$repositoryがnullの場合その時点でnullが返され、 getUser(5)やnameプロパティは呼ばれません。 11
実際のコードでみていきます 12
こういうクラスがあって(1) 13 ※実際にはDBから取得する処理があると思ってください
こういうクラスがあって(2) 14
いまままではこう 15 ※実は$userのnullチェックは省略しても WARNINGレベルです。 $user->getName()だと例外が発生します。
nullsafe演算子を使うとこう 16
ユーザーから注文一覧を取得して、そこから最後の注文の注 文商品名をとりたいときこんな感じに…… 17
メソッドを切り出して早期リターンすればネストは深くなら ないもののif文の数は多い…… 18
こんな場合でもnullsafe演算子を使うとこう 19 以下のように改行しても大丈夫
劇的BeforeAfter if文が乱雑に積み重ねられたコードが 匠の手(nullsafe演算子)によって、 スッキリと変貌を遂げました 20
でもさー そもそもnullableじゃなければ いいんじゃない? 21
どんな時も、とにかくUserを返しちゃおう 22
これでOK! 23
ではないですよね。 これは擬似的なコードなので問題は起きませんが、 実際のアプリケーションの場合DBから値を取得するなど、 Userが存在しない場合も考慮するケースも存在します。 24
考慮してみましょう 25
呼び出し側 26
これは簡易ですがNull Objectパターンと呼ばれる物で、 呼び出しを行う際にnullチェックは回避することが可能です。 27
ユーザーが存在しない場合は例外を投げたい 28
Null Objectパターンの実装 29
ユーザーが存在しない場合は例外を投げたい(ver.2) 30
このケースはnullsafe演算子でもカバー出来ないためnull チェックを行う必要があります。 31
どのタイミングでnullが返るか分からなくても良ければ nullsafe演算子でも可能 ※このケースだとrepositoryがnullは別途ハンドリングした方が良いのでオススメはしません 32
nullsafe演算子を使うとこういった書き方も出来ますが…… 33
都度メソッドチェーンで取得する処理の無駄(※1) と、 代入とnullチェックを行う方が結果的にtype数も少なく読みやすく なります 34 ※1:もしgetOrder()がSQLを発行してたら目も当てられない
なので、実際の使いどころとしては注文のプロパティまで取得する よりは注文オブジェクトを取得するといった場面になります 35
まとめ(使いどころ、使い分け) • アロー演算子(->) ◦ nullableでないことが型宣言により分かっ ている場合やnullチェック後に参照する時 • nullsafe演算子(?->) ◦ nullableであることが型宣言により分かっ
ている場合に1項目取得したい時 • Null Objectパターン ◦ 存在しない場合にも同じ振る舞い(名前を 返す等)をしてほしいもの 36
nullsafe演算子を用いる事で スマートに実装して行きましょう! 37
また、 今回はお話しませんでしたが、nullsafe演算子をより効率よ く使用するためには引数や戻り値にnullかどうか分かるように 型が定義されていることやPHPStanを用いた静的解析が欠か せません。ぜひPHPStanにも興味を持って頂ければと思いま す。 38
ご静聴ありがとうございました 39