PHPのエラー『Fatal Error: Declaration of Method Must be Compatible』の解決方法

  • 作成日 2025.03.18
  • php
PHPのエラー『Fatal Error: Declaration of Method Must be Compatible』の解決方法

このエラーは、クラスのメソッドが親クラスやインターフェースで定義されたものと互換性がない場合に発生する。特に、PHPのバージョンアップに伴い、メソッドのシグネチャ(引数や戻り値の型)が厳密にチェックされるようになったことで、このエラーが発生しやすくなっている。適切な方法でメソッドの定義を修正する必要がある。

1. エラーの概要と発生条件

このエラーは、子クラスが親クラスやインターフェースのメソッドをオーバーライドする際に、メソッドの引数や戻り値の型が一致しない場合に発生する。例えば、以下のようなケースが該当する。

  • 親クラスと子クラスのメソッドの引数が異なる
  • 親クラスのメソッドが戻り値の型を指定しているのに、子クラスでは異なる型を指定している
  • インターフェースで定義されたメソッドと実装側のメソッドが異なる

2. エラー発生の例

以下のコードでは、親クラスのメソッドと子クラスのメソッドで引数の数が異なるため、エラーが発生する。

class ParentClass {
    public function exampleMethod(string $param) {
        echo "Parent method: $param";
    }
}

class ChildClass extends ParentClass {
    public function exampleMethod() { // 引数が異なる
        echo "Child method";
    }
}

この場合、以下のエラーが発生する。

Fatal error: Declaration of ChildClass::exampleMethod() must be compatible with ParentClass::exampleMethod(string $param)

3. 解決策1: メソッドのシグネチャを統一する

親クラスのメソッドと子クラスのメソッドの引数と戻り値の型を一致させることで解決できる。

class ParentClass {
    public function exampleMethod(string $param) {
        echo "Parent method: $param";
    }
}

class ChildClass extends ParentClass {
    public function exampleMethod(string $param) { // 引数を親クラスと統一
        echo "Child method: $param";
    }
}

4. 解決策2: 戻り値の型を統一する

PHP 7.0以降では、戻り値の型も厳密にチェックされる。以下のようなケースではエラーとなる。

class ParentClass {
    public function getValue(): int {
        return 100;
    }
}

class ChildClass extends ParentClass {
    public function getValue(): string { // 戻り値の型が異なる
        return "100";
    }
}

この場合、戻り値の型を統一する必要がある。

class ChildClass extends ParentClass {
    public function getValue(): int { // 戻り値の型を親クラスと統一
        return 100;
    }
}

5. 解決策3: 可変引数を使用する

引数の数が異なる場合は、可変引数(...)を利用することで互換性を維持できる。

class ParentClass {
    public function exampleMethod(string ...$params) {
        echo "Parent method: " . implode(", ", $params);
    }
}

class ChildClass extends ParentClass {
    public function exampleMethod(string ...$params) { // 可変引数で統一
        echo "Child method: " . implode(", ", $params);
    }
}

6. 解決策4: インターフェースを実装する場合の注意点

インターフェースを実装する際には、メソッドの定義を完全に一致させる必要がある。以下のコードはエラーとなる。

interface SampleInterface {
    public function doSomething(int $num);
}

class SampleClass implements SampleInterface {
    public function doSomething($num) { // 型指定がないためエラー
        echo "Number: $num";
    }
}

この場合、以下のように修正する必要がある。

class SampleClass implements SampleInterface {
    public function doSomething(int $num) { // インターフェースと一致させる
        echo "Number: $num";
    }
}

7. 解決策5: PHPのバージョンアップに伴う影響を考慮する

PHPのバージョンが古い場合は、このエラーが発生しないことがあるが、PHP 8以降ではより厳密なチェックが行われる。php -v コマンドでバージョンを確認し、最新の仕様に合わせてコードを修正することが重要。

8. まとめ

このエラーは、メソッドの引数や戻り値の型が親クラスやインターフェースと一致しない場合に発生する。エラーメッセージを確認し、メソッドのシグネチャを統一することで解決できる。