IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Héritage d'une méthode getInstance ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Par défaut [POO] Héritage d'une méthode getInstance ?
    Bonjour,

    j'ai plusieurs classes qui possèdent la méthode getInstance() suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function getInstance() {
           if (!self::$_instance instanceof self) {
               self::$_instance = new self();
            }
            return self::$_instance;
        }
    Pour éviter d'avoir à la remettre dans chaque nouvelle classe j'avais pensé faire un héritage mais elle me renvoit bien évidement l'instance de la classe mère

    Savez s'il existe un moyen de 'forcer' les classes à avoir cette méthode par défaut ? Ou est-ce tout simplement impossible ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Par défaut
    Que veux-tu faire exactement? Forcer une classe dérivée à implémenter GetInstance?

    Si c'est ça, tu peux soit dériver d'une classe abstraite et déclarer une méthode abstraite qui forcera la classe dérivée à l'implémenter, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    abstract class BaseClass
    {
    	public abstract function GetInstance();
     
     
    }
    class ChildClass extends BaseClass
    {
    	public function GetInstance()
    	{
    		return "Hello";
    	}
    }
     
    $obj = new ChildClass();
    echo $obj->GetInstance();
     
    ?>
    en déclarant la méthode GetInstance comme abstraite (abstract), tu forces la classe dérivée à l'implémenter. Tu ne peux déclarer une méthode abstraite que dans une classe abstraite. Tu ne pourras par contre plus instancier ta classe de base car une classe abstraite ne peut être que dérivée et non instanciée.

    Par contre, tu peux aussi laisser ta classe de base telle quelle et implémenter une interface au niveau des classes dérivées pour les forcer à implémenter la/les méthode(s) de ton choix

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    interface MyInterface
    {
     
    	public function GetInstance();
    }
     
    class BaseClass 
    {
    	public function __construct()
    	{
    	  echo 'Hello from base';
    	}	
    }
     
     
    class ChildClass extends BaseClass implements MyInterface
    {
    	public function GetInstance()
    	{
    		return "Hello";
    	}
    }
     
    $obj = new ChildClass();
    echo $obj->GetInstance();
    Une interface étant un "contrat" que doivent respecter toutes les classes qui l'implémentent.

    Voilà, j'espère que ça t'a aidé

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 147
    Par défaut
    J'ai une question à te poser stephane eyskens.
    Imaginons qu'une classe abstraite possède deux méthodes (avancer et reculer par exemple).
    Comment dois-je faire si je ne veux pas utiliser la méthode "reculer" dans une classe dérivé ?

  4. #4
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function getInstance() {
      if (!self::$_instance instanceof self) {
        self::$_instance = new self();
      }
      return self::$_instance;
    }
    getInstance() n'est pas censée être static ? Sinon il n'y a pas trop d'intéret...

    php ne supporte pas le late binding pour les membres static, donc on ne peut pas faire ce que tu souhaites de manière élégante (naturelle disons).

    Une solution "partielle" c'est de déclarer self::$_instance static protected dans la classe mère, mais de quand même redéfinir la méthode static public getInstance() dans la classe fille. Alors Fille::getInstance() retournera une instance de Fille ainsi que tous les call successif (Mere ou Fille). Tout dépend sur quelle classe s'effectue le premier call de getInstance()

    Imaginons qu'une classe abstraite possède deux méthodes (avancer et reculer par exemple).
    Comment dois-je faire si je ne veux pas utiliser la méthode "reculer" dans une classe dérivé ?
    La classe peut être abstraite mais quand même définir les méthodes. Par exemple une méthode qui ne fait rien et qui n'a pas besoins d'être redéfinie dans une classe fille.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Par défaut
    OK merci bien pour ces précisions

    Oui, la méthode est bien static.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/03/2007, 13h02
  2. Réponses: 2
    Dernier message: 26/01/2007, 11h50
  3. Réponses: 3
    Dernier message: 15/12/2006, 17h14
  4. [POO] [Introspection] exécuter une méthode
    Par sir_gcc dans le forum Langage
    Réponses: 3
    Dernier message: 04/12/2006, 20h37
  5. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 29/04/2005, 00h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo