9
votes

Comment une classe PHP peut-elle étendre une autre une fonction privée?

J'essaie d'étendre une classe PHP sans réécrire le tout. Voici un exemple: xxx

Cependant, lorsque j'exécute le script, j'obtiens l'erreur suivante: xxx

Il semblerait que la barre ne soit pas hériter de la fonction privée setsomething (). Comment puis-je résoudre ce problème sans modifier la classe FOO?


7 commentaires

Vous ne pouvez pas changer SetSomething () à protégé ?


Comme je l'ai dit ci-dessus, la classe FOO ne doit pas être modifiée. Comment voudrai-je faire cela?


Vous utilisez le bon outil pour le travail, c'est-à-dire le faire protégé .


Je comprends votre point cependant que je n'ai pas d'accès pour changer la classe d'origine. J'ai peut-être trop simplifié l'exemple. La classe d'origine provient d'un autre fichier qui est simplement inclus avec exigence ().


Dans ce cas, l'auteur ne veut pas qu'il soit disponible en sous-classe. Ou n'a pas pensé à la phase de conception. Donc, c'est une règle de conception de cette classe mère.


Ensuite, contactez l'auteur d'origine et indiquez clairement que vous devez prolonger la classe.


Oh bien, j'essayais de faire quelque chose qui dépasse clairement la portée de la conception initiale. Je détesterais dire qu'ils n'en pensaient pas, je ne pense pas qu'ils auraient pu anticiper ce que j'ai à l'esprit.


6 Réponses :


7
votes

Les membres privés ne sont pas héritables, vous ne pouvez pas les utiliser en sous-classe. Ils ne sont pas accessibles en dehors de la classe.

Vous devez avoir besoin de faire cette fonction aussi protégée ou publique. Les membres protégés sont accessibles à cette classe et pour la classe héritée. Donc, votre meilleur pari est de faire de cette fonction protégée.


2 commentaires

Comme je l'ai dit ci-dessus, la classe FOO ne doit pas être modifiée. Comment voudrai-je faire cela?


@Kennethvogt: Vous n'avez pas de choix ici.



15
votes

non , vous ne pouvez pas résoudre ce problème sans modifier la classe FOO. Parce que une classe héritée ne peut pas accéder aux membres privés de la classe mère . C'est une très basique règle.

Déclarer SetSomething () comme protégé . Ça va être résolu.

voir manuel


3 commentaires

Comme je l'ai dit ci-dessus, la classe FOO ne doit pas être modifiée. Comment voudrai-je faire cela?


Vous ne pouvez pas le faire aussi longtemps que de maintenir OOP.


Donc, le héritage privé en C ++ n'est pas réel de OOP? Je ne suis pas d'accord.



7
votes

bar est hériter la fonction d'accord, mais cela ne peut pas l'appeler. C'est tout le point de des méthodes privées , seule la classe de déclaration peut les appeler.


3 commentaires

Donc, je devrais définir explicitement définir quelque chose () dans ma classe de bar?


Oui, c'est la méthode Sane pour faire cela.


Une meilleure méthode consiste à utiliser protégée dans la classe mère;) de cette façon qu'il reste privé de l'extérieur, mais la classe "enfant" peut y accéder.



0
votes

Sans modifier la classe d'origine, la classe héritée n'a aucun moyen d'appeler directement des méthodes privées de la classe mère.


0 commentaires

4
votes

1 commentaires

Wow, cela m'a fait peur de ne pas trop devenir fantaisie. Nice info cependant.



1
votes

Avez-vous essayé cela?

class bar extends foo {

    public function xxx() {
      $this->something = parent::xxx();
      $this->something++;
      return $this->something;
    }
}


0 commentaires