L'appel d'une enfant de la méthode de la classe parente en PHP
Avoir la classe suivante hiérarchie:
class TheParent{
public function parse(){
$this->validate();
}
}
class TheChild extends TheParent{
private function validate(){
echo 'Valid!!';
}
}
$child= new TheChild();
$child->parse();
Qu'est-ce que la séquence d'étapes de ce travail?
Le problème, c'est quand j'ai couru que le code qu'il a donné le message d'erreur suivant:
Fatal error: Call to private method TheChild::validate() from context 'TheParent' on line 4
Depuis TheChild
hérite de TheParent
ne devrait pas $this
appelé dans parse()
référence à l'instance de $child
, donc validate()
sera visible à parse()
?
Remarque:
Après avoir fait quelques recherches, j'ai trouvé que la solution de ce problème pourrait soit faire de la validate()
fonction protected
selon ce commentaire dans le manuel PHP, mais je ne suis pas bien comprendre pourquoi il fonctionne dans ce cas.
La deuxième solution est de créer une abstract protected
méthode validate()
dans le parent et l'écraser à l'enfant (qui sera redondant) pour la première solution que protected
méthodes d'un enfant peut être consulté à partir de la mère?!!
Quelqu'un peut-il expliquer comment l'héritage fonctionne dans ce cas?
OriginalL'auteur Songo | 2012-10-17
Vous devez vous connecter pour publier un commentaire.
Votre idée de l'héritage est correct, mais pas la visibilité.
Protégée peut être utilisée par la classe et héréditaire, et les parents des classes, privée ne peut être utilisé dans la classe réelle qu'il a été défini.
$child->parse()
dans mon code, il va exécuter la fonctionparse
dans la classe parent et$this
intérieur, il sera se référant à la classe parent pas l'enfant?Il n'est qu'un exemple, mais du point de vue de l'instance.. privé méthodes de classes parents ne sont tout simplement pas autorisés à être appelé. C'est exactement le but et la différence entre
private
,protected
etpublic
.OriginalL'auteur Evert
Autres affiches déjà souligné que la mehods doivent être protégés afin d'y accéder.
Je pense que vous devriez changer une chose dans votre code. De votre classe de base
parent
s'appuie sur une méthode définie dans une classe enfant. C'est la mauvaise programmation. Modifier votre code comme ceci:la création d'une fonction abstraite s'assure que l'enfant classe certainement ont la fonction
validate
parce que tous les résumé des fonctions d'une classe abstraite doit être mis en œuvre pour héritant de cette classeC'est la réponse correcte. Il ne suffit pas de mettre en œuvre la méthode dans la classe enfant, et croise les doigts, dans l'espoir qu'il en sera toujours ainsi. Veiller à ce que l'enfant DOIT définir la méthode est le chemin à parcourir!
OriginalL'auteur JvdBerg
Privé ne peut être accessible que par la classe qui définit, ni les parents, ni les enfants des classes.
Utiliser protégé à la place:
OriginalL'auteur Udan
À PARTIR DE PHP DOC
Privé ne peuvent être accessibles que par le
class which defines
ouSame object type
ExempleSortie
Valide!!Valide!!
OriginalL'auteur Baba