【PHPエラー対処方法】Fatal error: Uncaught Error: Call to undefined method T::f()

PHPでの開発時に以下のようなエラーが頻繁に発生します。

Fatal error: Uncaught Error: Call to undefined method T::g() in main.php:6 Stack trace: #0 {main} thrown in main.php on line 6

原因は、存在しないメソッドや未定義のメソッドを呼び出していることです。

  • メソッドがきちんと定義されているか
  • メソッド名のスペルが間違っていないか

これらをきちんと確認する必要があります。

<?php
class T {
   function f() { echo "OK"; }
}
$t = new T();
$t->g(); // Fatal error: Uncaught Error: Call to undefined method T::g()
$t->f(); // OK

コンストラクタ呼び出しが失敗する場合

またコンストラクタ呼び出しの際にも、同等のエラーが発生することがあります。

Fatal error: Uncaught Error: Call to undefined method A::A() in main.php:8 Stack trace: #0 main.php(12): B->__construct() #1 {main} thrown in main.php on line 8

この場合のエラーの原因は、親クラスのコンストラクタをクラス名形式(parent::A())で呼び出していることです。

<?php
class A {
   function __construct() {}
}

class B extends A {
   function __construct() {
      parent::A(); // Error: Call to undefined method A::A()
   }
}

$b = new B();

親クラスのコンストラクタが__constructメソッドの形式で定義されている場合、小クラスから親クラスのコンストラクタを呼び出す際も同様に__construct形式で呼び出す必要があります。

class B extends A {
   function __construct() {
      parent::__construct(); // OK
   }
}

先祖クラスのコンストラクタを呼び出す方法

先祖クラス(親クラスの親クラスなど)のコンストラクタを呼び出す場合にも同様のエラーが発生してしまうことがあります。この場合、スコープ定義演算子で先祖クラスの名前を指定する形でコンストラクタを呼び出して対処します。

<?php
class A           { function __construct() {} }
class B extends A { function __construct() {} }
class C extends B {
   function __construct() {
      A::__construct(); // OK
      // parent::A();   // Error: Call to undefined method B::A()
   }
}

$c = new C(); // CとAのコンストラクタのみが呼ばれる

この場合、new C()によるインスタンス化の際にはクラスCとクラスAのコンストラクタのみが呼び出されることになります。クラスBのコンストラクタは呼び出されなくなります。

広告

広告