it-swarm.com.de

Die Methodendeklaration sollte mit den übergeordneten Methoden in PHP kompatibel sein

Strenge Standards: Die Deklaration von childClass :: customMethod () sollte mit der von parentClass :: customMethod () 
 Kompatibel sein.

Was sind mögliche Ursachen für diesen Fehler in PHP? Wo finde ich Informationen darüber, was es heißt, kompatibel zu sein?

100
waiwai933

childClass::customMethod() hat andere Argumente oder eine andere Zugriffsebene (öffentlich/privat/geschützt) als parentClass::customMethod().

122
davidtbernal

Diese Meldung bedeutet, dass bestimmte mögliche Methodenaufrufe zur Laufzeit fehlschlagen können. Angenommen, Sie haben

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

Der Compiler vergleicht den Aufruf von $ a-> foo () nur mit den Anforderungen von A :: foo (), für die keine Parameter erforderlich sind. $ a kann jedoch ein Objekt der Klasse B sein, für das ein Parameter erforderlich ist, sodass der Aufruf zur Laufzeit fehlschlagen würde.

Dies kann jedoch niemals fehlschlagen und löst den Fehler nicht aus

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

Daher darf keine Methode mehr erforderliche Parameter haben als ihre übergeordnete Methode.

Dieselbe Meldung wird auch generiert, wenn die Typhinweise nicht übereinstimmen, aber in diesem Fall ist PHP noch restriktiver. Dies führt zu einem Fehler:

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

wie geht das:

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

Das scheint restriktiver zu sein, als es sein muss, und ich nehme an, dass es an Interna liegt.

Sichtbarkeitsunterschiede verursachen einen anderen Fehler, jedoch aus dem gleichen Grund. Keine Methode kann weniger sichtbar sein als die übergeordnete Methode.

35
ldrut

wenn Sie das OOP Formular behalten möchten, ohne einen Fehler auszuschalten, können Sie auch:

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

Nur um diesen Fehler im Kontext einer Schnittstelle zu erläutern, wenn Sie einen Hinweis auf Ihre Funktionsparameter wie folgt eingeben:

Schnittstelle A

use Bar;

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

Klasse B

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

Wenn Sie vergessen haben, die Anweisung use in Ihre implementierende Klasse (Klasse B) aufzunehmen, wird dieser Fehler auch dann angezeigt, wenn die Methodenparameter identisch sind.

0
Spholt