概要
Fatal errorまとめその1。
タイトル「~」の箇所にはメソッド名が入る。
なんのエラーか
日本語にすると「XXXというメンバー関数はオブジェクトにありません」という意味。
このエラーが出ている行(実際のエラーメッセージには、エラーになったクラスと行数が出力されている)で
Sample.php
$obj->XXX();
のようなメンバー関数呼び出しをされている。
「XXXという関数」が無いと言われる。
考えられる原因としては
- 本当にその関数が無い
- オブジェクトが生成されていない
が有力。これ以外にもあるよという方は教えてください。
確認手順
- スペルミスのチェック
- オブジェクトが生成されているかをvar_dump
-
- のチェックで生成されている場合は、そのあとのコードでオブジェクトが削除されていないか
1. スペルミスのチェック
- そもそもスペルがあっているか
- 大文字・小文字があっているか
- 全角・半角があっているか
- 余計なスペースがメソッド名に入っていないか
2. オブジェクトが生成されているかをチェック
以下のようにvar_dumpしてチェックする。
Sample2.php
$obj = new YYY();
var_dump($obj);
$obj->XXX();
もしvar_dumpの結果がNULLならオブジェクトの生成がうまくいっていないということになる。
実戦ではこんなに近くに書いていないがために気づいていないということもある。
そのため、このエラーが出た場合には、オブジェクトが生成されている箇所の直後に
var_dumpをチェックする。
もし、このXXXという関数がYYYというクラスオブジェクトに定義されているのであれば、事前にYYYクラスオブジェクトを生成する必要がある。
3. 2. のチェックで生成されている場合は、オブジェクトが削除されていないか
Sample3.php
$obj = new YYY();
var_dump($obj); // YYYのオブジェクトが生成されていることを確認
// 何か長いコードがある・・・
$obj = null; // こんな感じのとかあったらビンゴ。違うパターンもあるので、そこはvar_dumpしながら。
$obj->XXX(); // Fatal error ~ on a non-object
まとめ
ソースコードを最後は追うしかないが、自分が書いたコードなら自分に責任がある。他の人の書いたコードでも、今は自分が関わっているため、しっかり読んで修正を加えていくしかない。頑張ろう。