PHP・Laravelでnullsafeに開発する
おそらく初心者が悩むであろうnullの扱い。インターネットスラングでは
NullPointerException をぬるぽと言うことがあるほど、多くのエンジニアはnullの扱いに悩まされます。
そこで今回はLaravelにおけるnullsafeな開発をご紹介します。
▼ 目次
nullsafeとは
まず、nullsafeとはなんでしょうか。ずばり、nullという値を持つことを許容し、NullPointerExceptionが発生しない概念のことです。
つまり、もう「ガッ!」する必要がなくなります。
null安全ともいわれ、JavaやC#などの静的型付でありながらも比較的柔軟なプログラミング言語で採用されています。
そしてPHPにおいてもPHP8から導入されました。
nullsafeの利点と欠点
nullsafeの利点としては以下が考えられます。
- 可読性の向上
簡素に記述できるようになります。二項演算子や三項演算子による記述が減ります。 - API操作の向上
たとえば動的なプロパティをもつAPIからデータを取得するときに、nullsafeなら例外が発生しません。 - データベース操作の向上
ORMを使って、リレーション先のデータを取得する際に、nullsafeなら例外が発生しません。
このように、いままでNULLの場合は~と記載していたことが不要になります。
一方で欠点もあります。
- nullが発生した場合、どこで処理するのかが不明結局どこかでnullの対応が必要とする意見も多数あります。
- 上記の理由により型安全が脅かされるコンパイラでは適切にエラーを出力できなくなります。
以上のことを考慮すると、固めの業務ロジック等にはあまり向かなさそうです。
PHP・Laravelでnullsafeに開発しよう
では、ここからPHPおよびLaravelでnullsafeに開発してみましょう。
laravelでは古くから
optional() 関数がありましたが、PHP8よりnullsafe演算子が導入されたので、どちらでも記載することができます。
そこで両方の記載方法をユースケースとともに紹介します。
データベースからデータを取得する。
例えば、USERテーブルとそれに1対1で関連するJOBテーブルがあるとします。
USERテーブル
ID | name | JOB_ID |
1 | タロ | 1 |
2 | ジロ | null |
3 | サブロ | 2 |
JOBテーブル
ID | job_name |
1 | SE |
2 | 営業 |
3 | 総務 |
このとき、以下のようにUSERのIDを指定すればjob_nameが取れるとします。
1 |
$userJobName = User::find(1)->job->job_name; //例 「SE」 |
ではid=2のとき、どうなるでしょうか。次のようなエラーが出ます。
1 |
Attempt to read property "job_name" on null |
おなじみのエラーですね。
では、この対応法としては次が考えられます。
1 2 3 |
$userJobName = User::find(2)->user ? User::find(2)->user->job_name : ""; //古典的な方法 $userJobName = optional(User::find(2)->user)->job_name; //Laravelのoptional関数を利用。nullを返却 $userJobName = User::find(2)->user?->job_name; //PHP8のnullsafe演算子。nullを返却 |
いろいろ書けますね。下の二つだと、SQLを1度発行するだけで済むのでリソースを有効活用できるのではないでしょうか。
まとめ
nullsafeな開発をすることで、さまざまなメリットがあります。しかし、その分のデメリットもあります。
そのため、うまく使い分けることが大切です。みなさんも使えそうなところでは使ってみてください。
ウィズテクノロジーで一緒に働きませんか?
分野を限定せず幅広い事業を展開。新しい技術の導入にも積極的に取り組んでおり、チャレンジや成長する機会が沢山。
あなたの経験・知識を活かしながら一緒にIT業界を盛り上げて行きましょう!
採用情報詳細はコチラ