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] PHP5 et surcharge de constructeurs


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 28
    Points : 27
    Points
    27
    Par défaut [POO] PHP5 et surcharge de constructeurs
    Bonjour à tous,

    J'ai un petit soucis en PHP5.
    Je suis en train de créer une classe relativement simple. J'aimerais cependant que celle-ci puisse être instanciable via des variables ou via un fichier XML.

    Je me suis alors posé la question de savoir comment faire cela, et j'ai trouvé 2 solutions :

    Le première est de créer un constructeur vide puis 2 méthodes qu'on appelerait selon les besoins. Ca donnerait :
    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
     
    public function __construct()
    {
    // rien
    }
     
    public function init_from_var($var1,$var2)
    {
    // traitement
    }
     
    public function init_from_file($file)
    {
    // traitement
    }
    L'instanciation devrait alors se faire en 2 étapes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $myvar = new Classe();
     
    // Puis, selon le cas :
    $myvar->init_from_var($var1,$var2);
     
    // Ou :
    $myvar->init_from_file($file);
    La seconde solution que j'ai trouvé est d'avoir un constructeur unique et de créer une méthode statique permettant de créer une nouvelle instance de ma classe. Ca donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function __construct($var1,$var2)
    {
    // traitement
    }
     
    public static function readFile($f)
    {
    //traitement
     
        return new Classe($var1,$var2);
    }
    L'instanciation ne se fait plus qu'en une étape, selon le cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Cas où l'on instancie à partir des variables :
    $myvar = new Classe($var1,$var2);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Cas où l'on instancie à partir du fichier :
    $myvar = Classe::readFile($f);

    En cherchant sur le net (et en particulier ici), j'ai pu constater que mon idée n'est pas si débile puisque des gens ont posté exactement la même chose dans la doc PHP. (ça me rassure quelque peu sur mes capacités en PHP5 )

    Cependant, j'aimerais savoir si une méthode est plus "juste" ou plus "propre" que l'autre ? Pour le moment, je suis parti sur la base d'un constructeur et d'une méthode statique. Mais j'aimerais avoir des avis de pros sur ce "soucis" de conception

    Merci d'avance !

  2. #2
    Membre émérite
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Points : 2 969
    Points
    2 969
    Par défaut
    Salut, tu peux utiliser le pattern Factory : http://pcaboche.developpez.com/artic...=page_4#L2.1.1

    Bon développement
    Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN

    F.A.Q. : Java, PHP, (X)HTML / CSS

    N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 28
    Points : 27
    Points
    27
    Par défaut
    Merci pour ce lien, je ne connaissais pas du tout. (A vrai dire je ne me suis pas encore intéressé aux interfaces en PHP).

    J'ai lu quelques exemples (celui-ci en particulier : http://www.patternsforphp.com/w/index.php?title=Factory ) et si je comprends bien, dans mon cas je devrais créer une interface (celle qu'ils appellent iFactory dans l'exemple puis 3 classes :
    • Une classe "mère" qui implémente mon interface.
    • Une 1ère classe "fille" dont le constructeur prendra en compte les variables.
    • Une seconde classe "fille" dont le constructeur prendra en compte le fichier.


    J'ai bien mis "mère" et "fille" entre guillemets car il n'y aucun lien d'héritage entre elles

    Là où je ne suis pas sûr de tout bien comprendre, c'est pour les attributs et les méthodes.
    Vu que tout est commun et identique, tout est uniquement stocké dans la classe qui implémente l'interface ?

    Exemple, codé (c'est plus compréhensible que mes phrases ) :
    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
    36
    37
    38
    39
    40
    41
    42
    43
     
    interface iFactory
    {
        public function createInstance();
    }
     
    class Classe implements iFactory
    {
        private $var1;
        private $var2;
     
        public function __construct()
        {
     
        }
     
        public function createInstance()
        {
              // ici selon le cas, soit :
              $out = new Classe1();
     
              // soit :
              $out = new Classe2();
        }
     
        // autres méthodes ici
    }
     
    class Classe1
    {
         public function __construct($p1, $p2)
         {
          // traitement
         }
    }
     
    class Classe2
    {
        public function __construct($file)
        {
          // traitement
        }
    }
    Est-ce que $var1 et $var2, les attributs de ma classe Classe sont "atteignables" dans les classes Classe1 et Classe2 (j'ai un gros doute...) et si oui, comment ?
    Sinon... j'avoue que j'ai du mal à comprendre l"intérêt

    Enfin, quel traitement puis-je faire pour décider si je lance le constructeur de Classe1 ou celui de Classe2 dans ma méthode createInstance de ma classe Classe ?

Discussions similaires

  1. [PHP 5.2] [POO] Surcharge du constructeur d'une classe
    Par anaranjado dans le forum Langage
    Réponses: 5
    Dernier message: 28/08/2009, 12h23
  2. [Windev 12] Surcharge de constructeur POO
    Par jonas0 dans le forum WinDev
    Réponses: 8
    Dernier message: 23/04/2008, 18h51
  3. [POO] Surcharge de constructeur
    Par loganblack dans le forum Langage
    Réponses: 4
    Dernier message: 17/05/2006, 12h26
  4. [POO] surcharger le constructeur
    Par wdionysos dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 15h42
  5. Réponses: 2
    Dernier message: 21/10/2005, 11h26

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