psr2 psr coding php methods standards-compliance

coding - psr php



La declaración de métodos debe ser compatible con los métodos principales en PHP (5)

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 objetivo es hacer que tanto $b->foo como $b->($m, $n, $l) funcionen bien.

Strict Standards: Declaration of childClass::customMethod() should be compatible with that of 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 ?


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

Por lo tanto, 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.


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 declaración 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.


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


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