Code Fix

初級

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()を呼ぶとここで止まります。

直し方: nullnew 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()を呼んでいます。オブジェクトを生成し忘れると必ずここで止まります。

直し方: nullnew 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()の呼び出しでエラーになります。

直し方: nullnew Order() にします。

この問題を解いてみる →

よくある誤解

「変数に何か入っていればメソッドを呼べるはず」という思い込みは誤りです。nullはオブジェクトではないため、どんなメソッド名を書いてもこのエラーになります。

まとめ

Call to a member function on nullは初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

他の言語ではどうなるか

広告
広告スロット(未設定)