Estándares estrictos: la declaración de childClass :: customMethod () debe 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 ?
php
methods
standards-compliance
waiwai933
fuente
fuente
function customMethod( ... )
use Closure;
sugerencia de tipo, pero luego no lo había agregado a la parte superior de mi clase (ya que la sugerencia de tipo eraClosure
). Entonces ... asegúrese de verificar si le faltan dependencias como esa.Respuestas:
childClass::customMethod()
tiene argumentos diferentes, o un nivel de acceso diferente (público / privado / protegido) queparentClass::customMethod()
.fuente
parentClass::customMethod($thing = false)
ychildClass::customMethod($thing)
desencadenaría el error, porque el método del niño no ha definido un valor predeterminado para el primer argumento.&
) en los argumentos también puede desencadenar este error.Este mensaje significa que hay ciertas posibles llamadas a métodos que pueden fallar en tiempo de ejecución. Suponga que tiene
El compilador solo verifica la llamada $ a-> foo () con los requisitos de A :: foo () que no requiere parámetros. Sin embargo, $ a puede ser un objeto de clase B que requiere un parámetro y, por lo tanto, la llamada fallaría en tiempo de ejecución.
Sin embargo, esto nunca puede fallar y no desencadena el error.
Por lo tanto, ningún método puede tener más parámetros necesarios 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:
como hace esto:
Eso parece más restrictivo de lo que debería ser y supongo que se debe a factores 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.
fuente
Si desea mantener el formulario OOP sin desactivar ningún error, también puede:
fuente
func_get_args()
, por ejemplo, enB
,public function foo($a = null, $b = null, $c = null)
, ya que esto no se rompe el contrato prometido porA
.Solo para expandir este error en el contexto de una interfaz, si escribe insinuando los parámetros de su función de esta manera:
interfaz A
Clase B
Si ha olvidado incluir la
use
declaración en su clase de implementación (Clase B), también obtendrá este error aunque los parámetros del método sean idénticos.fuente
Enfrenté este problema al intentar extender una clase existente desde GitHub. Voy a tratar de explicarme, primero escribiendo la clase como pensé que debería ser, y luego la clase como es ahora.
Lo que pensé
Lo que finalmente hice
Entonces, parece que este error surge también cuando está utilizando un método que devuelve una clase con espacio de nombres e intenta devolver la misma clase pero con otro espacio de nombres. Afortunadamente he encontrado esta solución, pero no entiendo completamente el beneficio de esta característica en php 7.2, para mí es normal reescribir los métodos de clase existentes a medida que los necesite, incluida la redefinición de los parámetros de entrada y / o incluso el comportamiento del método.
Una desventaja del enfoque anterior es que los IDE no podían reconocer los nuevos métodos implementados en \ mycompany \ CutreApi \ ClassOfVendor (). Entonces, por ahora, iré con esta implementación.
Hecho actualmente
Entonces, en lugar de intentar usar el método "lo que sea", escribí uno nuevo llamado "getWhatever". De hecho, ambos están haciendo lo mismo, solo devuelven una clase, pero con diferentes espacios de nombres como he descrito antes.
Espero que esto pueda ayudar a alguién.
fuente