2011-06-25 2 views
3

J'apprends toujours à utiliser les classes et je me demandais quand utiliser le mot-clé extends (étendre une classe). Disons que j'ai une classe qui fait chose A (et c'est un singleton). Est-il correct de l'étendre à un autre qui fait une chose B, même si la classe B n'est pas vraiment liée à la classe A, mais qu'elle utilise beaucoup de ses méthodes? Ou devrais-je créer une nouvelle classe?Extension des classes PHP

+0

Pourriez-vous expliquer dans quelles circonstances vous devez étendre la classe singleton? Peut-être y at-il une autre approche de conception ... Avez-vous entendu parler de * modèle d'injection de dépendance *? –

Répondre

0

Les extensions devraient être utilisées par exemple si vous voulez accéder à des variables privées par les deux classes. Si vous pouviez montrer votre travail, nous pourrions vous dire ce que vous devriez ou ne devriez pas faire.

+0

c'est vraiment beaucoup de code :) Fondamentalement, la classe A est le cœur du site. Il obtient les articles de la base de données (la base de données a sa propre classe), et affiche des modèles à l'écran, etc. La classe B crée du contenu pour la barre latérale (quelque chose comme des widgets dans WordPress) – Alex

+0

Et pensez-vous peronnellement que vous devez étendre classe A par classe B? – genesis

+0

Je ne suis pas sûr. Mais je pense qu'appeler les méthodes de la classe A de B comme '$ this-> do_stuff()' au lieu de 'A :: getInstance() -> do_stuff()' semble plus agréable – Alex

4

Dans la programmation orientée objet, une classe doit généralement étendre une autre classe si c'est un type spécial de cette classe avec des utilisations plus spécifiques.

Exemple: Bike classe étend Automobile

Bad Exemple: classe étend Car Bike (peut partager des méthodes similaires, mais cela ne fait pas vraiment de sens)

2

Assurez-vous que vous créez un nouveau membres statiques pour le stockage instance singleton et surcharger la méthode getInstance(). Sinon, vous finirez par accéder à une instance même lorsque vous appelez B::getinstance() car il n'y aurait qu'un seul membre statique pour les deux classes.

5

En ce qui concerne la programmation orientée objet, une classe effectue généralement une tâche spécifique, telle que la conservation des informations utilisateur ou le contrôle des entrées/sorties. Quand vous avez 1 objet utilisé pour contrôler la sortie, vous pouvez définir une méthode dans cet objet pour contrôler le type de sortie, ou comment chaque contenu spécifique doit être géré, mais cela signifierait que les objets Le but unique a été brisé, car il ne s'agit plus seulement d'envoyer du contenu, mais aussi de manipuler du contenu en fonction de son type.

Une façon dont nous utilisons à venir sur c'est en regroupant un ensemble de tâches dans un groupe de classes/objets, par exemple:

abstract class Output 
{ 
    public $content_type = 'text/plain'; 

    public function _send(){} 
} 

La classe de sortie aurait évidemment des méthodes beaucoup plus, mais seulement des méthodes liés au contenu ouputting, tels que les en-têtes, etc., et non la manipulation du contenu, vous auriez quelque chose comme:

class HTMLOutput extends Output 
{ 
    public $content_type = 'text/html'; 
} 

et pour la manipulation du contenu:

Voici les principaux points d'architecture que je respecte lorsque je crée et que j'organise plusieurs classes/objets groupés.