2010-12-14 33 views
2

Existe-t-il une possibilité de réduire le niveau d'accès d'une fonction dans une classe dérivée en PHP?réduire le niveau d'accès d'une fonction dans une classe dérivée

exemple (... signifie plus de code)

class foo 
{ 
    public function myFunction() { ... } 
    public function myOtherFunction() { ... } 
} 

class bar extends foo 
{ 
    private function myFunction() { ... } 
} 

Maintenant, je should'nt pouvoir appeler MyFunc ion un objet bar. Mais le faire de cette façon ne semble pas être valide en PHP. Un autre moyen? Je sais que je pourrais implémenter une fonction vide mais je ne veux pas du tout exposer la fonction dans l'interface.

Répondre

4

Ce n'est pas valide dans la POO de toute façon. Si vous implémentez une méthode publique, vous le promettez, cette classe et tous les enfants fournissent cette fonctionnalité. Supprimer une méthode publique signifie que vous rompez vos promesses;) Parce que toutes les méthodes et propriétés publiques définissent l'interface de la classe et la rupture d'une interface n'est jamais une bonne idée. Sans aucune information plus claire sur ce que vous allez faire, je suggère de lancer une exception, quelque chose comme "Non supporté".

+0

La pensée était que j'ai une classe abstraite qui a une fonction appelée registerObject() et puis j'ai une classe qui l'étend et qui a une fonction appelée registerForm() qui appelait simplement parent :: registerObject() mais serait un nom plus approprié pour l'objet en question. Mais vous avez raison, c'est une mauvaise pratique quand j'y pense:) ... Je devrais probablement faire une fonction protégée registerObject() et avoir ensuite la fonction publique registerForm() dans la classe dérivée et ainsi de suite. – inquam

+0

Nous avons une classe OurException extends Exception. Nous avons 2 façons de créer une instance de OurException. En raison de l'incapacité innée des PHPs à surcharger __construct d'une manière élégante, nous aimerions créer 2 méthodes statiques, ie. OurException :: newA et OurException :: newB (d'après mes recherches, cela semble être une manière assez standard de contourner la surcharge). Mais nous ne voulons pas que les gens utilisent "new OurException", donc nous aimerions rendre __construct protected ou private. Ce n'est pas possible car Exception __construct est public. – Pancho

+0

... suite. Malheureusement, cela n'a aucun sens dans notre contexte de lancer une exception "non supporté" lorsqu'une exception est en cours de lancement. Si PHP pouvait surcharger de manière fiable un constructeur, il serait plus logique d'adhérer à la «promesse» de la POO que vous avez mentionnée ci-dessus. Cependant, sans surcharger propre, l'incapacité de "réduire l'accessibilité à __construct" est dans notre contexte très problématique ... et je ne sais vraiment pas comment contourner le problème :( – Pancho