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] Instancier une classe fille appelante depuis la classe mère


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Points : 125
    Points
    125
    Par défaut [POO] Instancier une classe fille appelante depuis la classe mère
    Bonjour à tous ^^

    Je suis en php 5.2.8

    J'ai plusieurs classe filles dont jaimerais pouvoir créer une instance depuis la classe mère.

    Sachant que je ne veux pas avoir à retoucher la classe mère à chaque fois que je crée une nouvelle classe fille. Le but étant de faire quelque chose de générique que je n'aurais pas à modifier.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class GenericTable {
     
        public function __construct() {
     
        }
     
        public static function test() {
     
            // instancier la classe TableA si appelé depuis TableA::test()
            // instancier la classe TableB si appelé depuis TableB::test()
            // ...
     
            return $instance;
        }
    }
     
    class TableA extends GenericTable {
     
        public function __construct() {
     
     
        }
    }
     
    class TableB extends GenericTable {
     
        public function __construct() {
     
     
        }
    }
     
    $objTableA = TableA::test();
    $objTableB = TableB::test();

    Si le problème manque de clarté faites moi signe, étant dedans je n'ai peut-être pas le recul nécessaire.

    Un grand merci d'avance.
    LikeZone
    Le meilleur du like

  2. #2
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    si le code est un "fabricant" d'objet alors ce code sera plutôt en dehors de la classe "GenericTable"
    et donc tu auras ce genre de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Fabricanttable
    {
        static public generation($typeTable)
        {
            $nomClasse = "Table$typeTable";
     
            return new $nomClasse();
        }
    }
     
    $objetTableB = Fabricanttable::generation('B');
    GNAP !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Points : 125
    Points
    125
    Par défaut
    J'aimerais tant qu'à faire éviter d'envoyer le nom de la classe en paramètre de la méthode statique
    LikeZone
    Le meilleur du like

  4. #4
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Citation Envoyé par loacast Voir le message
    J'ai plusieurs classe filles dont jaimerais pouvoir créer une instance depuis la classe mère.
    Quel est l'intéret ?

    Citation Envoyé par loacast Voir le message
    J'aimerais tant qu'à faire éviter d'envoyer le nom de la classe en paramètre de la méthode statique
    Cela me semble difficile sans lui envoyer en paramètre le nom de la classe fille, même impossible. Comment veux tu qu'il instancie la bonne classe sinon ?

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

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Points : 125
    Points
    125
    Par défaut
    Quel est l'intéret ?
    En un mot : Généricité

    Cela me semble difficile sans lui envoyer en paramètre le nom de la classe fille, même impossible. Comment veux tu qu'il instancie la bonne classe sinon ?
    C'est la question que je pose ^^
    LikeZone
    Le meilleur du like

  6. #6
    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
    Cela ne va pas rendre générique ta classe, mais spécifique au contraire.

    Si tu inclu de la logique métier de tes classes filles dans ta classe mère, c'est que tu as un souci de conception.

    Ta classe mère doit posséder une méthode de génération "sommaire", ensuite, si chaque classe fille doit faire des traitements de génération plus spécifiques, il faut surcharger (sans oublier d'appeler la méthode mère parent::generation()).

  7. #7
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Il n'y a une solution "correcte" qu'à partir de php 5.3, avec le support du late static binding (static sera lié à la classe appellante et non déclarante).

    Si je reprends ton code dans la classe GenericTable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static function test() {
      $instance = new static;
      return $instance;
    }

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Cela ne va pas rendre générique ta classe, mais spécifique au contraire.

    Si tu inclu de la logique métier de tes classes filles dans ta classe mère, c'est que tu as un souci de conception.

    Ta classe mère doit posséder une méthode de génération "sommaire", ensuite, si chaque classe fille doit faire des traitements de génération plus spécifiques, il faut surcharger (sans oublier d'appeler la méthode mère parent::generation()).
    exemple de code qui me vient a l'esprit
    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 MapperAbstract {
       protected $instance;
       public getInstance() {
          if(static::$instance === null) {
             static::$instance = new static();
          }
          return static::$instance;
       }  
    }
    class MonMapper1 extends MapperAbstract {
       protected $instance;
    }
    class MonMapper2 extends MapperAbstract {
       protected $instance;
    }
    monMapper2::getInstance();
    plus simple que

    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
     
    abstract class MapperAbstract {
       abstract public getInstance();
    }
    class MonMapper1 extends MapperAbstract {
       protected $instance;
       public getInstance() {
          if(self::$instance === null) {
             self::$instance = new self();
          }
          return self::$instance;
       }  
    }
    class MonMapper2 extends MapperAbstract {
       protected $instance;
       public getInstance() {
          if(self::$instance === null) {
             self::$instance = new self();
          }
          return self::$instance;
       }  
    }
    monMapper2::getInstance();
    Surtout si on doit répéter la manip 20 fois.....

  9. #9
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Si tu inclu de la logique métier de tes classes filles dans ta classe mère, c'est que tu as un souci de conception.
    +32
    Ta demande va dans le sens contraire même de la philosophie de la POO.
    Développeur | Zend Certified Engineer

    Étapes Pour mieux se servir du forum:
    1. Commencez par lire les cours et tutoriels ;
    2. Faites une recherche;
    3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

    Nix>_Rien n'est plus pratique que la théorie

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par Thes32 Voir le message
    +32
    Ta demande va dans le sens contraire même de la philosophie de la POO.
    -33 (juste parce que ça me gonfle les mec qui pensent qu'il ont plus de voix que les autres)

    La base de l'héritage des class en POO c'est de pouvoir réutiliser (et/ou adapter) le code...
    Quel intérêt de dériver une class, s'il faut ré implémenter tous les méthodes ? y compris les méthodes static...
    Quel intérêt d’étendre une class parent si les méthodes static ne remontent pas a la class appelante ?...

    Jet un oeil au "late static bindings"

  11. #11
    Membre averti Avatar de sayari.dev
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 142
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    Il y a une fonction qui retourne le nom de la classe appellante

    get_called_class()

    si tu l'utilises depuis ton static test() tu auras le nom de la classe fille appelée, mais malheureusement cette fonction est définie depuis PHP 5.3.0. Sur sa page de docummentation sur le fameux manuel, il y a quelqu'un qui a essayé de l'émuler pour des versions antérieures par ici, à toi de checker si ça marche bien ou pas.
    C'est en faisant n'importe quoi qu'on devient n'importe qui

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par sayari.dev Voir le message
    Bonjour,

    Il y a une fonction qui retourne le nom de la classe appellante

    get_called_class()

    si tu l'utilises depuis ton static test() tu auras le nom de la classe fille appelée, mais malheureusement cette fonction est définie depuis PHP 5.3.0. Sur sa page de docummentation sur le fameux manuel, il y a quelqu'un qui a essayé de l'émuler pour des versions antérieures par ici, à toi de checker si ça marche bien ou pas.
    Bien vu la call stack pour retrouver l'appelant... techniquement cela fonctionne a condition qu'il n'y ai pas plusieurs class appelées sur la meme lignes (dans l'instanciation d'un array par exemple).
    En revanche coté perf je suis septic : récupérer la callStack + ouvrir le fichier et récupérer la bonne ligne + expression régulière pour trouver la class... ca fait beaucoup...

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Citation Envoyé par revlis Voir le message
    Bien vu la call stack pour retrouver l'appelant... techniquement cela fonctionne a condition qu'il n'y ai pas plusieurs class appelées sur la meme lignes (dans l'instanciation d'un array par exemple).
    En revanche coté perf je suis septic : récupérer la callStack + ouvrir le fichier et récupérer la bonne ligne + expression régulière pour trouver la class... ca fait beaucoup...
    passe à php5.3, la 5.2 est une véritable horreur.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par kaymak Voir le message
    passe à php5.3, la 5.2 est une véritable horreur.
    Parfois on n'a pas le choix... 5.3 a beau exister depuis plus d'un an, elle ne fait toujours pas partie des paquets supportés par la dernière Debian (Lenny).
    La solution serait de passer par une version compilée a la main ou une version non officielle, mais les désires des développeurs n'est pas toujours compatible avec ceux de l'infogérance.

Discussions similaires

  1. Réponses: 8
    Dernier message: 25/09/2013, 21h38
  2. Réponses: 6
    Dernier message: 09/02/2011, 14h39
  3. [Doxygen]Commenter une fonction héritée depuis la classe fille
    Par khazna dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 31/01/2009, 14h20
  4. Réponses: 1
    Dernier message: 02/05/2008, 20h34
  5. Réponses: 3
    Dernier message: 27/04/2007, 14h51

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