nullになりうるプロパティへのメソッド呼び出しは ?-> で守る
途中のプロパティがnullかもしれないオブジェクトの連鎖に対して、通常の->でメソッドを呼ぶと致命的エラーになります。?->を使うと、途中がnullの場合は例外を投げずnullを返して処理を続けられます。
エラーメッセージの読み方
Fatal error: Uncaught Error: Call to a member function getCity() on null in main.php:9
main.php- ファイル名
9- 行番号 — 実際にクラッシュした行
Error- 例外クラス — 何が起きたか。ここを検索するのが最短です
Call to a member function getCity() on null- 内容 — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 <?php 2 class User { 3 public ?Address $address = null; 4 } 5 class Address { 6 public function getCity(): string { return "Tokyo"; } 7 } 8 $u = new User(); 9 echo $u->address-> getCity(); ^
Fatal error: Uncaught Error: Call to a member function getCity() on null in main.php:9
$u->addressはnullのままです。通常の->でメソッドを呼ぶと致命的エラーになります。?->を使えば、途中がnullの場合は例外を投げずnullを返して処理を続けられます。
直し方: -> を ?-> にします。
広告
広告スロット(未設定)
パターン2
1 <?php 2 class Order { 3 public ?Customer $customer = null; 4 } 5 class Customer { 6 public function getName(): string { return "Al"; } 7 } 8 $o = new Order(); 9 echo $o->customer-> getName(); ^
Fatal error: Uncaught Error: Call to a member function getName() on null in main.php:9
$o->customerがnullのまま->でメソッドを呼ぶと致命的エラーです。?->を使うとnullの場合は安全にnullを返します。
直し方: -> を ?-> にします。
パターン3
1 <?php 2 class Post { 3 public ?Author $author = null; 4 } 5 class Author { 6 public function getEmail(): string { return "a@example.com"; } 7 } 8 $p = new Post(); 9 echo $p->author-> getEmail(); ^
Fatal error: Uncaught Error: Call to a member function getEmail() on null in main.php:9
$p->authorはnullなので、通常の->での呼び出しは致命的エラーになります。?->に変えることで安全に処理を続けられます。
直し方: -> を ?-> にします。
よくある誤解
「nullチェックはif文で毎回書くしかない」という思い込みは、?->を知らないと起きがちです。ネストが深いほど毎回のnullチェックは冗長になり、?->を使えば1箇所で安全に済みます。
まとめ
nullになりうるプロパティへのメソッド呼び出しは ?-> で守るは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。