La statement de métodos debe ser compatible con los métodos principales en PHP

  Normas estrictas: Declaración de childClass :: customMethod () debería ser compatible con la de parentClass :: customMethod ()

¿Cuáles son las posibles causas de este error en PHP? ¿Dónde puedo encontrar información sobre lo que significa ser compatible ?

childClass::customMethod() tiene diferentes argumentos, o un nivel de acceso diferente (público / privado / protegido) que parentClass::customMethod() .

Este mensaje significa que hay ciertas llamadas a métodos posibles que pueden fallar en el tiempo de ejecución. Supongamos que tiene

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

El comstackdor solo verifica la llamada $ a-> foo () contra los requisitos de A :: foo () que no requiere parámetros. Sin embargo, $ a puede ser un objeto de la clase B que requiere un parámetro y, por lo tanto, la llamada fallará en el tiempo de ejecución.

Sin embargo, esto nunca puede fallar y no desencadena el error

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

Entonces ningún método puede tener más parámetros requeridos que su método principal.

El mismo mensaje también se genera cuando las sugerencias de tipo no coinciden, pero en este caso PHP es aún más restrictivo. Esto da un error:

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

como lo hace esto:

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

Eso parece más restrictivo de lo que debe ser y supongo que se debe a elementos internos.

Las diferencias de visibilidad provocan un error diferente, pero por la misma razón básica. Ningún método puede ser menos visible que su método principal.

si quiere mantener el formato OOP sin desactivar ningún error, también puede:

 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(); // ... } } 

Solo para expandir este error en el contexto de una interfaz, si está escribiendo insinuando los parámetros de su función de esta manera:

interfaz A

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

Clase B

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

Si olvidó incluir la statement de use en su clase de implementación (Clase B), también obtendrá este error aunque los parámetros del método sean idénticos.

Clase abstracta A

 abstract class A { function foo(); } 

Niño Clase B

 class B { function foo($a=null, $b=null, $c=null) { //do what you want with the parameters. } } 

Ejemplo:

 $b = new B(); $b->foo(); $b->($m, $n, $l); 

El objective es hacer que tanto $b->foo como $b->($m, $n, $l) funcionen bien.