Fatal Error: Call to a member function ***() on a non-objectに若干ハマった
結果よくある感じのハマり方ではあったのだけど、エラーだけ見てたらわかりづらかったので備忘録。
クラス継承を使ってフレームワークを拡張していた時に起こったエラー。これまで全くエラーを起こしたことのない継承元のセッション関数がタイトルのようなエラーを起こしたので最初???(^q^)てなってた。
他のページでは正常に動いているので、新しいページが悪さしてる感じなのはわかったけど、いまいち原因が特定できない。
ちなみに上記エラーは「***()関数の呼び元がオブジェクトじゃないよ」というエラーらしい。大体の場合は呼び元が設定され忘れているから起こるらしく、ググって調べた時に出てきた記事はそういう解決方法が多かった。今思えばこれが混乱のもとだった。
このエラーは副産物として出たエラー
つまり、原因は別のところにあって、その流れでこのエラーがでてた。こんな凡ミスなのに長々と文章書いてるの恥ずかしくなってきたので、そろそろ終わりにしようと思う。
単純に継承元(親)で呼んでるコンストラクタを継承先(子)のコンストラクタで上書きしていたのが原因だった。なんという凡ミス。タイトルのエラーは単に、継承元のコンストラクタでオブジェクトを定義してて、それが上書きされていたから出ていただけだった。
継承先のコンストラクタの最初に
parent::__construct();
を書いて、継承元のコンストラクタを呼んでから継承先のコンストラクタを呼ぶ。引数がある場合はそれも忘れずに。
このエラーの解決方法を結構調べてたんだけど、今回みたいな記事を見なかったので一応書いてみた。あったけど理解できなかっただけかもしれない。