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
3 Réponses :
Il s'agit de la visibilité des variables / méthodes. P>
Vous remarquerez que dans la classe Alors, lorsque bar code>, la méthode testprivate () code> est privé code>. Cela signifie que seul lui-même peut accéder à cette méthode. Pas d'enfants. P>
FOO code> étend bar code>, puis demande à exécuter la méthode test () code>, il fait deux choses: p>
testublic () code> car il est public et foo code> a le droit de le remplacer avec sa propre version. Li>
test () code> sur bar code> strong> (car test () code> n'existe que sur la barre () code>). li>
ol>
testprivate () code> est pas strong> remplacé et fait partie de la classe qui contient test () code>. Par conséquent, bar :: testprivate code> est imprimé.
testPublic () code> est strong> remplacé et fait partie de la classe héritante. Par conséquent, foo :: testPublic code> est imprimé. P>
Droit. Merci @Rockerest pour une explication propre.
Mais si vous echo $ ceci-> Testprivate () Code> de l'intérieur FOO: TestPublic CODE>, il echo foo :: testprivate code>. 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 code> 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 () code>, $ ceci code > Références La copie temporaire de la classe code> de la bar code> (vous donnant barre :: testprivate () code>), mais $ CU code> à l'intérieur du FOO Code> La classe fera référence à la classe foo code> (vous donnant foo :: testprivate () code>).
@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 code> que vous avez mentionnée - get_class ($ this) code> toujours la sortie foo code>.
@bfavaretto Où est votre get_class () code> appel? Intérieur bar code>? Ou dans foo code>? 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.
Dans certains cas, il est facile de noter que vous voulez une méthode
Mais attendez, c'est public ou privé?
Voici le modificateur
Lorsqu'une méthode est
Lorsqu'une méthode est
Lorsqu'une méthode est
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! p>
Pas une réponse constructive. Vous pouvez laisser un commentaire avec quelque chose de constructif et pas de rant.
Astuce: Vous obtiendrez la sortie souhaitée si vous modifiez
privé code> versprotégé code>. 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.