J'essaie d'étendre une classe PHP sans réécrire le tout. Voici un exemple: Cependant, lorsque j'exécute le script, j'obtiens l'erreur suivante: p> 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? P> p>
6 Réponses :
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. P>
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. P>
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.
non fort>, vous ne pouvez pas résoudre ce problème sans modifier la classe FOO. Parce que Déclarer voir manuel p> SetSomething () code> comme
protégé code>. Ça va être résolu. P>
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.
bar code> est hériter em> la fonction d'accord, mais cela ne peut pas l'appeler. C'est tout le point de
des méthodes privées code>, seule la classe de déclaration peut les appeler. P>
Donc, je devrais définir explicitement définir quelque chose () dans ma classe de bar?
Oui, c'est la méthode Sane i> 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.
Sans modifier la classe d'origine, la classe héritée n'a aucun moyen d'appeler directement des méthodes privées code> de la classe mère. p>
Essayez la réflexion p>
http://php.net/manual/fr/class.reflectionclass.php p>
Aussi: p>
Passez des méthodes privées et privées Propriétés de l'extérieur d'une classe dans PHP P>
Wow, cela m'a fait peur de ne pas trop devenir fantaisie. Nice info cependant.
Avez-vous essayé cela?
class bar extends foo { public function xxx() { $this->something = parent::xxx(); $this->something++; return $this->something; } }
Vous ne pouvez pas changer
SetSomething () code> à
protégé code>?
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é code>.
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.