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 :

[PHP/POO] Instancier une classe enfant à partir de la classe parent


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2016
    Messages : 37
    Points : 37
    Points
    37
    Par défaut [PHP/POO] Instancier une classe enfant à partir de la classe parent
    Bonjour,

    J'ai un problème en sauvegardant une entité sous doctrine et Symfony qui me mène à me poser des questions sur les bases...

    Imaginons qu'on ait deux classes A et B, la classe B hérite de la classe A. J'instancie une classe A avec toutes ses valeurs et je veux instancier la classe B à partir de la classe A. Comment faire ?

    Je sais qu'on peut appeler le constructeur de la classe A dans le constructeur de la classe B en faisant : mais dans ce cas on instancie une classe B et en même temps on instancie une (nouvelle !) classe A. Mais j'ai déjà une classe A que je veux récupérer !

    Pour ceux qui préfèrent une ligne de code plutôt qu'un beau roman :

    Nous avons :
    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
    class A{
        protected $name;
     
        public function getName(){
            return $this->name;
        }
        public function setName($name){
            $this->name = $name;
        }
    	public function __construct($name)
    	{
    		$this->name = $name;
    	}
    }
     
    class B extends A {
        protected $value;
     
        public function __construct($value){
            $this->value=$value;
        }
     
        public function getValue(){
            return $this->value;
        }
        public function setValue($value){
            $this->value=$value;
        }
    }
    Et on voudrait faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $a = new A('name A');
    $b = new B($a, 'value B');
    Merci pour vos réponses !

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    De but en blanc, je dirais que l'héritage ne sert à rien et qu'il vaut mieux opter pour une injection de dépendance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class B {
        protected $value;
     
        public function __construct(A $a, $value){
            $this->value=$value;
            //...
        }
        //...
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2016
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    De but en blanc, je dirais que l'héritage ne sert à rien et qu'il vaut mieux opter pour une injection de dépendance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class B {
        protected $value;
     
        public function __construct(A $a, $value){
            $this->value=$value;
            //...
        }
        //...
    }
    J'aurais résolu ça comme ça mais comme je le disais au début de mon message, le problème est bien plus complexe... Je vous invite à lire le fond du problème sur : http://www.developpez.net/forums/d16...fant-doctrine/.

    En gros, sous Symfony j'ai un utilisateur qui est crée et j'ai une classe "personnel de crèche" qui hérite de utilisateur. Et lorsque je veux sauvegarder la personne "personnel de crèche" il veut sauvegarder un nouvel utilisateur avec les champs tous à "null" alors que je veux qu'il récupère l'utilisateur courant.... Je me suis dit que si je pouvais spécifier que la classe "personnel de crèche" doit être crée à partir d'un utilisateur déjà existant dans le constructeur ça résoudrait mon problème ...

Discussions similaires

  1. [PHP 5.2] [POO] Instancier une classe fille appelante depuis la classe mère
    Par loacast dans le forum Langage
    Réponses: 13
    Dernier message: 15/08/2010, 17h12
  2. Réponses: 1
    Dernier message: 02/05/2008, 20h34
  3. Ouvrir une nouvelle class visuel à partir de la classe courante.
    Par undercrash dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 04/02/2008, 11h00
  4. Réponses: 3
    Dernier message: 27/04/2007, 14h51
  5. Peut on mettre à jour une page jsp à partir d'un classe?
    Par TOPGUN89 dans le forum Websphere
    Réponses: 4
    Dernier message: 21/12/2006, 17h56

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