2012-10-17 5 views
2

Avoir la hiérarchie de classe suivante:appel d'une méthode d'enfant de la classe parente en PHP

class TheParent{ 

    public function parse(){ 
     $this->validate(); 
    } 

} 

class TheChild extends TheParent{ 

    private function validate(){ 
     echo 'Valid!!'; 
    } 
} 

$child= new TheChild(); 
$child->parse(); 

Quelle est la séquence d'étapes dans lesquelles cela va fonctionner?

Le problème est quand je courais ce code, il a donné l'erreur suivante:

Fatal error: Call to private method TheChild::validate() from context 'TheParent' on line 4 

Depuis TheChild Hérite de TheParent ne doit pas $this appelé parse() se référer à l'instance de $child, donc validate() sera visible à parse()?

Note:
Après avoir fait quelques recherches, je trouve que la solution à ce problème soit faire la fonction validate()protected selon this comment dans le manuel PHP, bien que je ne comprends pas bien pourquoi il travaille dans ce Cas.

La seconde solution consiste à créer un procédé abstract protectedvalidate() dans le parent et le remplacer dans l'enfant (qui sera redondant) à la première solution comme protected méthodes de l'enfant peuvent être accessibles à partir du parent? !! Est-ce que quelqu'un peut expliquer comment l'héritage fonctionne dans ce cas?

Répondre

3

Votre idée de l'héritage est correcte, mais pas la visibilité.

Protégé peut être utilisé par la classe et les classes héritées et parent, private ne peut être utilisé que dans la classe réelle où il a été défini.

+0

hmmm alors quand j'appelle '$ child-> parse()' dans mon code, il lancera la fonction 'parse' dans la classe parente et' $ this' dedans il se référera à l'instance de classe parente et non à l'enfant? – Songo

+0

Il existe une seule instance, mais du point de vue de l'instance. Les méthodes privées des classes parentes ne peuvent tout simplement pas être appelées. C'est le but exact et la différence entre 'private',' protected' et 'public'. – Evert

2

Privé ne peut être accédé par la classe qui définit, ni les classes parents ou enfants.

utilisation protégée à la place:

class TheParent{ 

    public function parse(){ 
     $this->validate(); 
    } 

} 

class TheChild extends TheParent{ 

    protected function validate(){ 
     echo 'Valid!!'; 
    } 
} 

$child= new TheChild(); 
$child->parse(); 
0

de PHP DOC

Visibility from other objects

Objects of the same type will have access to each others private and protected members even though they are not the same instances. This is because the implementation specific details are already known when inside those objects.

privé ne peut être consulté par le class which defines ou Same object type Exemple

class TheChild { 
    public function parse(TheChild $new) { 
     $this->validate(); 
     $new->validate(); // <------------ Calling Private Method of $new 
    } 
    private function validate() { 
     echo 'Valid!!'; 
    } 
} 

$child = new TheChild(); 
$child->parse(new TheChild()); 

Sortie

Valide !! Valide !!

14

D'autres affiches ont déjà souligné que les mehods doivent être protégés afin d'y accéder.

Je pense que vous devriez changer encore une chose dans votre code. Votre classe de base parent repose sur une méthode définie dans une classe enfant. C'est une mauvaise programmation.Changer votre code comme ceci:

abstract class TheParent{ 

    public function parse(){ 
     $this->validate(); 
    } 

    abstract function validate(); 

} 

class TheChild extends TheParent{ 

    protected function validate(){ 
     echo 'Valid!!'; 
    } 
} 

$child= new TheChild(); 
$child->parse(); 

la création d'une fonction abstraite assure que la classe enfant certainement ont la fonction validate parce que toutes les fonctions abstraites d'une classe abstraite doit être mis en œuvre pour hériter d'une telle classe

+0

Dommage que le gars qui comprend réellement OOP un niveau au-delà du reste est négligé comme ça. J'aurais donné la réponse abstraite à la fonction – pythonian29033

+1

Ceci est la bonne réponse. Il ne suffit pas de simplement implémenter la méthode dans la classe enfant, et de croiser les doigts dans l'espoir qu'il en sera toujours ainsi. S'assurer que l'enfant DOIT définir la méthode est la voie à suivre! –

Questions connexes