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

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

Fatal error: Call to undefined method T::f() in a.php on line 6
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: Call to undefined method T::g() in a.php on line 6
$t->f(); // OK

可変メソッドを利用した際のエラー

クラスのメソッドを可変関数を用いて動的に呼び出すようなケースでも、同等のエラーが発生する場合があります。

class T {
  function f() { echo 'ok'; }
}

$t = new T();

$name = 'f';
$t->$name(); // "ok"(`f`メソッドが定義されているため可能)

$name = 'g'; // `g`メソッドは定義されていないためエラーに繋がる
$t->$name(); // Fatal error: Call to undefined method T::g() in a.php on line 11

可変関数に存在しないメソッド名や空文字を指定しないように注意する必要があります。

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

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

Fatal error: Call to undefined method A::A() in a.php on line 8
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(); // Fatal error: Call to undefined method A::A() in a.php on line 8
   }
}

$b = new B();

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

class B extends A {
   function __construct() {
      parent::__construct(); // OK
   }
}
参考:PHP 親クラスのコンストラクタ呼び出し【仕様や互換性、先祖クラスの呼出し】

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

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

<?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のコンストラクタのみが呼ばれる
参考:先祖クラスのコンストラクタを呼び出す方法
広告
広告