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 :

accès à une classe fille non instanciée


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 30
    Points : 25
    Points
    25
    Par défaut accès à une classe fille non instanciée
    Bonjour,
    Je voulais savoir s'il est possible dans une méthode d'une classe mère d'accèder à la classe fille non instanciée correspondante.
    Un exemple valant mieux que des grands discours, ci dessous le type de chose que je souhaite faire:

    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
    //Une classe mere 
    abstract class ClasseMere
    {
         abstract function getTable();
         function requete()
         {
              return "select * from ".self::getTable().";"; 
         }
    }
    // Une classe fille
    class ClasseFille extends ClasseMere
    {
         const table="table_classe_fille";
         function getTable()
         {
              return self::table;
         }
    }
     
    // Et là le code appelant
    $requeteCharcher=ClasseFille::requete()
    Le souçi ici est que monsieur PHP me dit : Ah non, Call to undefined method ClasseMere::getTable().
    De la même manière, je ne peux appeler directement la constante table depuis la classe mère par self::table à l'intérieur de ClasseMere.
    Savez vous s'il y a une solution à ce que je cherche à faire?
    Merci d'avance

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    comme ca

    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
    abstract class ClasseMere
    {
         public static function requete()
         {
              return "select * from ".static::getTable().";"; 
         }
    }
    // Une classe fille
    class ClasseFille extends ClasseMere
    {
         const table="table_classe_fille";
     
         public static function getTable()
         {
              return self::table;
         }
    }
    par contre static et abstract ca va pas ensemble

    tu peux faire direct ca
    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
    abstract class ClasseMere
    {
         public static function requete()
         {
              return "select * from " . static::table . ";"; 
         }
    }
    // Une classe fille
    class ClasseFille extends ClasseMere
    {
         const table="table_classe_fille";     
    }
     
    // Et là le code appelant
    $requeteCharcher = ClasseFille::requete();
    echo $requeteCharcher;
    voir même récupérer qui appelle avec get_called_class

    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
    abstract class ClasseMere
    {
         public static function requete()
         {
             $class = preg_replace('/(?<!^)([A-Z])/u', '_$1', get_called_class());
             $table = 'table_' . strtolower($class);
     
             return "SELECT * FROM `$table`"; 
         }
    }
     
    class ClasseFille extends ClasseMere { }
     
    $requeteCharcher = ClasseFille::requete();
    echo $requeteCharcher;

  3. #3
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Pas du tout, il suffit de faire $this->getTable() afin de faire reference a l'instance de classe et non a sa definition.

    Aussi, si ta classe mere doit faire appel a des informations de ta classe fille cest que tu as un probleme de conception.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Pas du tout, il suffit de faire $this->getTable() afin de faire reference a l'instance de classe et non a sa definition.

    $this en static ?
    montre moi

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 30
    Points : 25
    Points
    25
    Par défaut Merci, cela fonctionne
    Merci à vous deux de vous être intéressé à ma question.
    Voici le résultat:
    $this->getTable() ne fonctionne pas car la classe est non instanciée (on est en static et monsieur PHP me demande "qui c'est $this?????").
    J'ai donc utilisé static::table (ou static::getTable() qui marche aussi) comme indiqué par stealth35 et cela fonctionne très bien.
    Merci encore

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/04/2014, 00h16
  2. Instanciation d'une classe fille depuis une classe mère
    Par khaled-benloucif dans le forum Langage
    Réponses: 2
    Dernier message: 30/01/2009, 23h59
  3. Accès aux attributs propres à une classe fille
    Par jamilya dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 24/12/2008, 15h06
  4. Instancier une classe fille
    Par adn013 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 14/08/2007, 10h48
  5. Réponses: 6
    Dernier message: 01/05/2006, 19h05

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