2 votes

Arrêtez le message "membre a un accès protégé"

Je ne suis pas sûr si c'est un bug ou si je fais quelque chose de mal mais considérez le code suivant :

ParentClass.php

a();
    }
}

ChildClass.php

``

Cependant, PhpStorm affiche une erreur dans ParentClass.php à la ligne return $obj->a(); en disant :

Accès protégé au membre

Le manuel dit que :

Les membres déclarés protégés ne peuvent être accédés que dans la classe elle-même et par les classes héritantes et parentes.

Est-ce un bug de PhpStorm ? Si oui, y a-t-il un moyen de désactiver cette erreur (idéalement pour les fichiers concernés mais globalement cela ferait aussi l'affaire en cas de besoin).

Note : Je ne discute pas du fait de savoir si ce sont des pratiques de codage qui devraient être suivies, mais le problème réel se situe profondément dans un code hérité que je suis très réticent à modifier et qui provoque l'apparition de lignes rouges ondulées dans ma barre de navigation de projet pour indiquer des erreurs (qui ne sont pas de réelles erreurs).

``

1voto

DanFromGermany Points 7201

Je peux reproduire cela avec phpStorm 2018.1.

Soit il s'agit d'un bug dans phpStorm, soit il s'agit simplement d'un avertissement de phpStorm car même s'il est possible en PHP d'accéder à un membre protégé de cette manière, on devrait être averti car c'est quelque chose à éviter probablement.

Parce que c'est déroutant, d'accéder à un membre protégé/privé en dehors de la portée.

L'explication est ici http://php.net/manual/en/language.oop5.visibility.php#language.oop5.visibility-other-objects

Les objets du même type auront accès aux membres privés et protégés de chacun même s'ils ne sont pas les mêmes instances. Cela se produit car les détails spécifiques de l'implémentation sont déjà connus à l'intérieur de ces objets.

Les deux de vos classes sont des instances de ParentClass donc elles peuvent toutes les deux accéder aux membres protégés et privés de chacune.

Comme l'a souligné LazyOne, il y a en réalité des bugs dans phpStorm concernant cela et des effets similaires: https://youtrack.jetbrains.com/issue/WI-11263

0voto

Chad K Points 183

La class ParentClass ne peut pas accéder à la méthode a() de l'enfant car la classe parent n'a pas cette fonction, elle n'hérite pas de cette fonction, et elle est protégée donc vous ne pouvez pas l'appeler depuis l'extérieur de sa classe ou d'une classe dérivée de ChildClass.

Si vous aviez a() défini dans ParentClass, alors vous pourriez créer la fonction getA() dans ChildClass et ensuite elle aurait accès à a()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X