web-dev-qa-db-ja.com

メソッドの宣言はPHPの親メソッドと互換性がなければなりません

厳格な標準:childClass :: customMethod()の宣言はparentClass :: customMethod()
の宣言と互換性がなければなりません

PHPでこのエラーが発生する可能性のある原因は何ですか? compatibleの意味についての情報はどこで入手できますか?

100
waiwai933

childClass::customMethod()には、parentClass::customMethod()とは異なる引数、または異なるアクセスレベル(public/private/protected)があります。

122
davidtbernal

このメッセージは、実行時に失敗する可能性のある特定のメソッド呼び出しがあることを意味します。あなたが持っていると仮定します

class A { public function foo($a = 1) {;}}
class B extends A { public function foo($a) {;}}
function bar(A $a) {$a->foo();}

コンパイラは、パラメーターを必要としないA :: foo()の要件に対して、呼び出し$ a-> foo()のみをチェックします。ただし、$ aはパラメーターを必要とするクラスBのオブジェクトである可能性があるため、呼び出しは実行時に失敗します。

ただし、これは失敗することはなく、エラーは発生しません。

class A { public function foo($a) {;}}
class B extends A { public function foo($a = 1) {;}}
function bar(A $a) {$a->foo();}

したがって、親メソッドよりも多くの必須パラメーターを持つメソッドはありません。

タイプヒントが一致しない場合にも同じメッセージが生成されますが、この場合、PHPはさらに制限されます。これによりエラーが発生します。

class A { public function foo(StdClass $a) {;}}
class B extends A { public function foo($a) {;}}

これと同様に:

class A { public function foo($a) {;}}
class B extends A { public function foo(StdClass $a) {;}}

それは必要以上に制限されているように思われ、私は内部のせいだと思います。

可視性の違いは異なるエラーを引き起こしますが、基本的な理由は同じです。親メソッドよりも見えにくいメソッドはありません。

35
ldrut

エラーをオフにせずにOOPフォームを保持したい場合は、次のこともできます。

class A
{
    public function foo() {
        ;
    }
}
class B extends A
{
    /*instead of : 
    public function foo($a, $b, $c) {*/
    public function foo() {
        list($a, $b, $c) = func_get_args();
        // ...

    }
}
20
Sajjad Shirazy

インターフェースのコンテキストでこのエラーを拡張するために、次のように関数パラメーターを示唆するタイプがある場合:

インターフェイスA

use Bar;

interface A
{
    public function foo(Bar $b);
}

クラスB

class B implements A
{
    public function foo(Bar $b);
}

実装クラス(クラスB)にuseステートメントを含めるのを忘れた場合、メソッドパラメーターが同一であってもこのエラーが発生します。

0
Spholt