Code Fix

中級

インターフェースのメソッドを実装し忘れると Fatal error になる

implementsで宣言したインターフェースのメソッドを1つでも実装し忘れると、そのクラス自体を読み込んだ時点で致命的エラーになります。インスタンス化する前、クラスの定義そのものが不完全と判定されます。

エラーメッセージの読み方

Fatal error: Class Person contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Greeter::greet) in main.php on line 5
main.php
ファイル名
5
行番号
Fatal error
エラー種別 — 例外ではなく、クラス定義を読み込んだ時点で検出されました
Class Person contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Greeter::greet)
内容 — 何が問題だったか

このエラーが出る典型パターン

パターン1

 1  <?php
 2  interface Greeter {
 3      public function greet(): string;
 4  }
 5  class Person implements Greeter {
 6                                                       
                                ^
 7  }
 8  $p = new Person();
Fatal error: Class Person contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Greeter::greet) in main.php on line 5

PersonはGreeterインターフェースが要求するgreet()を実装していません。クラス定義が読み込まれた時点で不完全と判定され、致命的エラーになります。

直し方: (空)public function greet(): string { return "Hi"; } にします。

この問題を解いてみる →

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

パターン2

 1  <?php
 2  interface Comparable {
 3      public function compareTo($other): int;
 4  }
 5  class Money implements Comparable {
 6                                                           
                                  ^
 7  }
 8  $m = new Money();
Fatal error: Class Money contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Comparable::compareTo) in main.php on line 5

MoneyはComparableのcompareTo()を実装していません。メソッド名やvisibility(public)まで一致させて実装する必要があります。

直し方: (空)public function compareTo($other): int { return 0; } にします。

この問題を解いてみる →

パターン3

 1  <?php
 2  interface Serializer {
 3      public function serialize(): string;
 4  }
 5  class Report implements Serializer {
 6                                                           
                                  ^
 7  }
 8  $r = new Report();
Fatal error: Class Report contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Serializer::serialize) in main.php on line 5

ReportはSerializerが要求するserialize()を実装していません。クラス定義の読み込み時点でチェックされ、実装が無ければ即座にエラーになります。

直し方: (空)public function serialize(): string { return "{}"; } にします。

この問題を解いてみる →

よくある誤解

「実装していないメソッドは、呼び出したときだけエラーになるはず」という思い込みは誤りです。クラスの定義が読み込まれた時点で全メソッドの実装がチェックされ、1つでも欠けていればその場でエラーになります。

まとめ

インターフェースのメソッドを実装し忘れると Fatal error になるは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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