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

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

「Fatal Error: Declaration of Method Must be Compatible」は、PHPのクラス継承時にメソッドのシグネチャ(引数や戻り値の型)が親クラスと互換性がない場合に発生するエラーです。特にPHP 7以降では型指定が厳格になったため、以前は問題なく動いていたコードでもエラーが発生することがあります。この記事では、エラーの発生条件と解決方法を詳しく説明します。

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

このエラーは、以下のようなケースで発生します。

  • サブクラスのメソッドが、親クラスのメソッドと異なる引数を持っている
  • 戻り値の型が親クラスと一致していない
  • 抽象クラスやインターフェースのメソッドを実装する際に定義が異なっている
  • PHP 7以降で、厳格な型指定が導入された影響を受ける

2. エラー発生の例

以下のコードは、親クラスと異なるメソッドの引数を持っているため、エラーが発生します。

class ParentClass {
    public function exampleMethod(string $param) {
        return $param;
    }
}

class ChildClass extends ParentClass {
    public function exampleMethod($param) {
        return strtoupper($param);
    }
}

$child = new ChildClass();
echo $child->exampleMethod("hello");

このコードを実行すると、次のようなエラーが発生します。

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

3. 親クラスのメソッドと完全に一致させる

エラーを回避するには、子クラスのメソッドが親クラスのメソッドと完全に一致するように定義します。

class ParentClass {
    public function exampleMethod(string $param): string {
        return $param;
    }
}

class ChildClass extends ParentClass {
    public function exampleMethod(string $param): string {
        return strtoupper($param);
    }
}

4. インターフェースのメソッド定義を正しく実装する

インターフェースを実装する際にメソッドの定義が一致していないとエラーになります。

interface SampleInterface {
    public function processData(array $data): int;
}

class SampleClass implements SampleInterface {
    public function processData($data) { // ←型指定がないためエラー
        return count($data);
    }
}

修正するには、型指定を追加します。

class SampleClass implements SampleInterface {
    public function processData(array $data): int {
        return count($data);
    }
}

5. 戻り値の型が異なる場合の修正

PHP 7以降では、戻り値の型が異なる場合もエラーになります。

class ParentClass {
    public function getData(): array {
        return [];
    }
}

class ChildClass extends ParentClass {
    public function getData(): string { // ←戻り値の型が異なるためエラー
        return "data";
    }
}

戻り値の型を親クラスと一致させます。

class ChildClass extends ParentClass {
    public function getData(): array {
        return ["data"];
    }
}

6. PHP 8で導入された「mixed」型を活用する

PHP 8では「mixed」型を使用することで、異なる型を受け入れられるようになります。

class ParentClass {
    public function process(mixed $input): mixed {
        return $input;
    }
}

class ChildClass extends ParentClass {
    public function process(mixed $input): mixed {
        return $input;
    }
}

7. 可変長引数を使う場合の注意点

引数の数を変更するのではなく、可変長引数を活用することも可能です。

class ParentClass {
    public function logMessage(string ...$messages): void {
        foreach ($messages as $message) {
            echo $message . PHP_EOL;
        }
    }
}

class ChildClass extends ParentClass {
    public function logMessage(string ...$messages): void {
        foreach ($messages as $message) {
            echo strtoupper($message) . PHP_EOL;
        }
    }
}

8. 型指定を外して回避する(非推奨)

最後の手段として、型指定を外すことでエラーを回避できますが、型の安全性が失われるため推奨されません。

class ParentClass {
    public function exampleMethod($param) {
        return $param;
    }
}

class ChildClass extends ParentClass {
    public function exampleMethod($param) {
        return strtoupper($param);
    }
}

9. PHPのバージョンを確認する

エラーが発生した場合、PHPのバージョンを確認し、最新のバージョンにアップデートすることで解決できることがあります。

php -v

10. まとめ

このエラーは、主にPHPの型指定が厳格になったことが原因で発生します。解決方法としては、親クラスやインターフェースのメソッドと完全に一致させることが基本です。特にPHP 7以降では戻り値の型も含めて整合性を保つ必要があります。