Call to a member function on null の原因と直し方
nullが入った変数に対してメソッドを呼び出そうとしたときに出るエラーです。オブジェクトを取得し損ねた変数をそのまま使うと、必ずここで止まります。
エラーメッセージの読み方
Fatal error: Uncaught Error: Call to a member function log() on null in main.php:7
main.php- ファイル名
7- 行番号 — 実際にクラッシュした行
Error- 例外クラス — 何が起きたか。ここを検索するのが最短です
Call to a member function log() on null- 内容 — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 <?php 2 class Logger { 3 public function log($msg) { echo $msg; } 4 } 5 function getLogger() { return null ; } ^ 6 $logger = getLogger(); 7 $logger->log("hi");
Fatal error: Uncaught Error: Call to a member function log() on null in main.php:7
getLogger()がnullを返しているため、$loggerはオブジェクトになっていません。nullに対してlog()を呼ぶとここで止まります。
直し方: null を new Logger() にします。
広告
広告スロット(未設定)
パターン2
1 <?php 2 class User { 3 public function getName() { return "Al"; } 4 } 5 $user = null ; ^ 6 echo $user->getName();
Fatal error: Uncaught Error: Call to a member function getName() on null in main.php:6
$userにnullが入ったままgetName()を呼んでいます。オブジェクトを生成し忘れると必ずここで止まります。
直し方: null を new User() にします。
パターン3
1 <?php 2 class Order { 3 public function total() { return 100; } 4 } 5 function findOrder() { return null ; } ^ 6 $order = findOrder(); 7 echo $order->total();
Fatal error: Uncaught Error: Call to a member function total() on null in main.php:7
findOrder()がnullを返しているため、$orderはオブジェクトではありません。total()の呼び出しでエラーになります。
直し方: null を new Order() にします。
よくある誤解
「変数に何か入っていればメソッドを呼べるはず」という思い込みは誤りです。nullはオブジェクトではないため、どんなメソッド名を書いてもこのエラーになります。
まとめ
Call to a member function on nullは初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。
関連するエラー
- 未定義の関数を呼び出したエラーの原因と直し方存在しない名前の関数を呼び出したときに出るエラーです。
- nullになりうるプロパティへのメソッド呼び出しは ?-> で守る途中のプロパティがnullかもしれないオブジェクトの連鎖に対して、通常の->でメソッドを呼ぶと致命的エラーになります。