6
votes

Exemple de visibilité manuelle PHP Manuel - Peut-on l'expliquer

J'ai vu cela dans le manuel PHP OOP http://www.php.net/manual /en/language.oop5.Visibilité.php et je ne peux pas me faire la tête pourquoi la sortie n'est pas ::: testprivate foo :: testpublic xxx


3 commentaires

Astuce: Vous obtiendrez la sortie souhaitée si vous modifiez privé vers protégé . Lisez à propos des deux modificateurs d'accès.


Vérifiez ce fil. La première réponse m'aide beaucoup.


Vérifiez ce fil. La première réponse m'aide beaucoup.


3 Réponses :


11
votes

Il s'agit de la visibilité des variables / méthodes.

Vous remarquerez que dans la classe bar , la méthode testprivate () est privé . Cela signifie que seul lui-même peut accéder à cette méthode. Pas d'enfants.

Alors, lorsque FOO étend bar , puis demande à exécuter la méthode test () , il fait deux choses:

  1. il remplace la méthode testublic () car il est public et foo a le droit de le remplacer avec sa propre version.
  2. il appelle test () sur bar (car test () n'existe que sur la barre () ).

    testprivate () est pas remplacé et fait partie de la classe qui contient test () . Par conséquent, bar :: testprivate est imprimé.
    testPublic () est remplacé et fait partie de la classe héritante. Par conséquent, foo :: testPublic est imprimé.


6 commentaires

Droit. Merci @Rockerest pour une explication propre.


Mais si vous echo $ ceci-> Testprivate () de l'intérieur FOO: TestPublic , il echo foo :: testprivate . Donc, on dirait que c'était remplacé lorsqu'il est appelé à partir de ce contexte. Maintenant, je suis confus!


@bfavaretto N'oubliez pas que $ CU est une variable dynamique qui fait référence à la classe dans laquelle le code est dans. Donc, alors que c'est le traitement test () , $ ceci Références La copie temporaire de la classe de la bar (vous donnant barre :: testprivate () ), mais $ CU à l'intérieur du FOO La classe fera référence à la classe foo (vous donnant foo :: testprivate () ).


@Rockerest j'ai fait quelques recherches supplémentaires et je trouve toujours la confusion. Je vous dois que cela fonctionne comme vous le dites, mais pourriez-vous vous recommander un article ou des documents où je peux en outre comprendre comment l'héritage fonctionne en interne dans PHP? Utilisation de la réflexion, par exemple, je ne trouve aucune trace de la copie temporaire de la barre que vous avez mentionnée - get_class ($ this) toujours la sortie foo .


@bfavaretto Où est votre get_class () appel? Intérieur bar ? Ou dans foo ? Il serait peut-être préférable de poser votre propre question, avec le code exact que vous avez et ce que vous attendez de se produire, et ce qui arrive réellement. D'autre part, il pourrait déjà y avoir une question à ce sujet quelque part sur cela.


@Rockerest a accepté, a créé une nouvelle question . Merci.



1
votes

Dans certains cas, il est facile de noter que vous voulez une méthode privée sur la classe bar , mais vous voulez également la foo classe pour y accéder.
Mais attendez, c'est public ou privé?
Voici le modificateur protégé .
Lorsqu'une méthode est privée , seule la classe elle-même peut appeler la méthode.
Lorsqu'une méthode est publique , tout le monde peut l'appeler, comme une fête libre.
Lorsqu'une méthode est protégée , la classe elle-même peut l'appeler ainsi que quiconque inhérent cette méthode (enfants) pourra l'appeler comme une méthode de leur propre.


0 commentaires

-1
votes

J'ai posté la même question il y a quelques jours ... parce que ce comportement n'a pas été logique pour moi non plus. $ Ceci est toujours fait référence à l'objet actuel qu'il est utilisé. Dans mon exemple d'avis, comme cela devrait lancer une erreur ou un avertissement ou quelque chose. Parce que dans l'exemple ci-dessus, vous accédez à des membres privés: SSS censé être inaccessible!


1 commentaires

Pas une réponse constructive. Vous pouvez laisser un commentaire avec quelque chose de constructif et pas de rant.