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");
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();
$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();
findOrder()がnullを返しているため、$orderはオブジェクトではありません。total()の呼び出しでエラーになります。
直し方: null を new Order() にします。
パターン4
1 <?php 2 class Cart { 3 public function total() { return 0; } 4 } 5 function getCart() { return null ; } ^ 6 $cart = getCart(); 7 echo $cart->total();
getCart()がnullを返しているため、$cartはオブジェクトになっていません。
直し方: null を new Cart() にします。
パターン5
1 <?php 2 class Session { 3 public function isActive() { return true; } 4 } 5 $session = null ; ^ 6 echo $session->isActive();
$sessionにnullが入ったままisActive()を呼んでいます。オブジェクトを生成し忘れると必ずここで止まります。
直し方: null を new Session() にします。
よくある誤解
「変数に何か入っていればメソッドを呼べるはず」という思い込みは誤りです。nullはオブジェクトではないため、どんなメソッド名を書いてもこのエラーになります。
実務での勘所
実務でよくある発生源は、データベースなどから「見つからなければ結果が無い」ことを表現する、find的な名前のメソッドです。該当するレコードが存在しない場合にnullを返す設計は自然ですが、呼び出し側がそれを想定せず「必ず見つかる」前提でそのままメソッドチェーンを続けると、ここで停止します。findで始まる名前のメソッドを呼んだ直後は、結果がnullである可能性を常に疑う習慣が実務では重要です。
関連するエラー
- 未定義の関数を呼び出したエラーの原因と直し方存在しない名前の関数を呼び出したときに出るエラーです。
- nullになりうるプロパティへのメソッド呼び出しは ?-> で守る途中のプロパティがnullかもしれないオブジェクトの連鎖に対して、通常の->でメソッドを呼ぶと致命的エラーになります。