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 ?
php
methods
standards-compliance
waiwai933
la source
la source
function customMethod( ... )
use Closure;
indication de type, mais je n'avais pas ajouté au début de ma classe (puisque l'indice de type l'étaitClosure
). Alors ... assurez-vous de vérifier si vous manquez de telles dépendances.Réponses:
childClass::customMethod()
a des arguments différents, ou un niveau d'accès (public / privé / protégé) différent deparentClass::customMethod()
.la source
parentClass::customMethod($thing = false)
etchildClass::customMethod($thing)
déclencherait l'erreur, car la méthode de l'enfant n'a pas défini de valeur par défaut pour le premier argument.&
) dans les arguments peut également déclencher cette erreur.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
Le compilateur vérifie uniquement l'appel $ a-> foo () par rapport 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 donc l'appel échouerait à l'exécution.
Cela ne peut cependant jamais échouer et ne déclenche pas l'erreur
Aucune méthode ne peut donc avoir plus de paramètres requis que sa méthode parente.
Le même message est également généré lorsque les indices de type ne correspondent pas, mais dans ce cas, PHP est encore plus restrictif. Cela donne une erreur:
comme ça:
Cela semble plus restrictif que nécessaire et je suppose que cela est dû à des éléments internes.
Les différences de visibilité provoquent une erreur différente, mais pour la même raison fondamentale. Aucune méthode ne peut être moins visible que sa méthode parente.
la source
si vous souhaitez conserver le formulaire POO sans désactiver aucune erreur, vous pouvez également:
la source
func_get_args()
, par exemple, enB
,public function foo($a = null, $b = null, $c = null)
car cela ne rompt pas le contrat promis parA
.Juste pour développer cette erreur dans le contexte d'une interface, si vous tapez une indication de vos paramètres de fonction comme ceci:
interface A
Classe B
Si vous avez oublié d'inclure l'
use
instruction sur votre classe d'implémentation (classe B), vous obtiendrez également cette erreur même si les paramètres de la méthode sont identiques.la source
J'ai rencontré ce problème en essayant d'étendre une classe existante à partir de GitHub. Je vais essayer de m'expliquer, en écrivant d'abord la classe comme je pensais qu'elle devrait être, puis la classe telle qu'elle est maintenant.
Ce que je pensais
Ce que j'ai finalement fait
Il semble donc que cette erreur se déclenche également lorsque vous utilisez une méthode qui retourne une classe d'espacement de noms et que vous essayez de renvoyer la même classe mais avec un autre espace de noms. Heureusement j'ai trouvé cette solution, mais je ne comprends pas tout à fait l'intérêt de cette fonctionnalité en php 7.2, pour moi il est normal de réécrire les méthodes de classe existantes au fur et à mesure que vous en avez besoin, y compris la redéfinition des paramètres d'entrée et / ou même le comportement du méthode.
Un inconvénient de l'approche précédente est que les IDE ne pouvaient pas reconnaître les nouvelles méthodes implémentées dans \ mycompany \ CutreApi \ ClassOfVendor (). Donc, pour l'instant, je vais aller avec cette implémentation.
Actuellement fait
Donc, au lieu d'essayer d'utiliser la méthode "n'importe quoi", j'en ai écrit une nouvelle appelée "getWwhat". En fait, les deux font la même chose, renvoyant simplement une classe, mais avec différents espaces de noms comme je l'ai décrit précédemment.
J'espère que cela peut aider quelqu'un.
la source