web-dev-qa-db-fra.com

La déclaration des méthodes doit être compatible avec les méthodes parent dans PHP

Normes strictes: La déclaration de childClass :: customMethod () doit être compatible avec celle de parentClass :: customMethod () 

Quelles sont les causes possibles de cette erreur en PHP? Où puis-je trouver des informations sur ce que signifie être compatible?

100
waiwai933

childClass::customMethod() a des arguments différents ou un niveau d'accès (public/privé/protégé) différent de parentClass::customMethod().

122
davidtbernal

Ce message signifie qu'il existe certains appels de méthode possibles qui peuvent échouer au moment de l'exécution. Supposons que vous ayez

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

Le compilateur compare uniquement l'appel $ a-> foo () aux exigences de A :: foo () qui ne nécessite aucun paramètre. $ a peut cependant être un objet de classe B qui nécessite un paramètre et l’appel échouera donc au moment de l’exécution.

Cela ne peut toutefois jamais échouer et ne déclenche pas l'erreur

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

Donc, aucune méthode ne peut avoir plus de paramètres requis que sa méthode parente.

Le même message est également généré lorsque les indications de type ne correspondent pas, mais dans ce cas PHP est encore plus restrictif. Cela donne une erreur:

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

comme ceci:

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

Cela semble plus restrictif que nécessaire et je suppose que cela est dû aux internes.

Les différences de visibilité entraînent une erreur différente, mais pour la même raison fondamentale. Aucune méthode ne peut être moins visible que sa méthode parente.

35
ldrut

si vous voulez conserver le formulaire OOP sans supprimer aucune erreur, vous pouvez également:

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

Juste pour développer cette erreur dans le contexte d'une interface, si vous tapez les paramètres de votre fonction comme suit:

interface A

use Bar;

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

Classe B

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

Si vous avez oublié d'inclure l'instruction use dans votre classe d'implémentation (classe B), vous obtiendrez également cette erreur même si les paramètres de la méthode sont identiques.

0
Spholt