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] constructeurs, paramètres et héritage


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 20
    Par défaut [POO] constructeurs, paramètres et héritage
    Bonjour tout le monde,

    J'ai un problème avec ces classes, j'ai isolé le problème mais j'ai pas réussi à le régler en bidouillant et j'ai rien trouvé sur google.

    Le code php en simplifié:
    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
     
    class A {
         protected $attribut1;
         protected $attribut2;
         public function __construct($parametre1, $parametre2 = false) {
              $this->attribut1 = $parametre1;
              $this->attribut2 = $parametre2;
         }
    }
     
    abstract class B extends A {
         protected $attribut3;
         public function __construct() {
              $this->attribut3 = 'blabla';
         }
    }
     
    class C extends B {
         protected $attribut4;
         public function __construct($parametre1 = 'truc_par_defaut') {
              $this->attribut1 = 'truc';
              $this->attrbut2 = true;
              $this->attribut4 = $parametre1;
         }
    }
    Alors le problème c'est que dans $parametre1 de C il y a 'C'. J'ai fini par comprendre qu'il se réfère au $parametre1 de A. Alors problème de conception (du genre j'aurai jamais dû en arriver a faire ça) ou y a t-il une astuce?

    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class C extends B {
         protected $attribut4;
         public function __construct($hoho, $parametre1 = 'truc_par_defaut') {
              $this->attribut1 = 'truc';
              $this->attribut2 = true;
              $this->attribut4 = $parametre1;
         }
    }
    mais aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class C extends B {
         protected $attribut4;
         public function __construct($hoho, $parametre1 = 'truc_par_defaut') {
              A::__construct('truc',true);
              $this->attribut4 = $parametre1;
         }
    }
    mais encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class C extends B {
         protected $attribut4;
         public function __construct($parametre1 = 'truc_par_defaut') {
              A::__construct('truc',true);
              $this->attribut4 = $parametre1;
         }
    }
    Je sens bien que ca me dépasse. A l'aide !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Difficile de faire un commentaire étant donné qu'il y a un nombre d'erreurs de nommage des membres assez important : $attribut, $attrbiut, $attrbut...

    Donc les problèmes viennent de là ? Ou c'est juste un exemple codé à l'arrache pour illustrer le problème ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 20
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    Difficile de faire un commentaire étant donné qu'il y a un nombre d'erreurs de nommage des membres assez important : $attribut, $attrbiut, $attrbut...

    Donc les problèmes viennent de là ? Ou c'est juste un exemple codé à l'arrache pour illustrer le problème ?
    C'est un code à l'arrache qui représente très exactement mon problème mais je vais corriger ça tout de suite. Je précise qu'il n'y a aucunes erreurs quand je lance le code. Il ne fait pas ce que je veux.

    C'est une histoire d'ordre des paramètres dans les constructeurs. Je vois pas comment lui dire de lancer le constructeur de A puis celui de B et enfin celui de C. Je pensais que c'était automatique en php5.3.0. De toute évidence le constructeur de A interfère avec celui de C au niveau des paramètres puisque le php veut absolument mettre le nom de la classe dans le premier paramètre du constructeur de C.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 20
    Par défaut
    (erreur)

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Si j'ai bien compris le problème.

    PHP ne fait pas "cascader" les constructeurs des super classes.

    si tu instancie C, les constructeurs de A et B ne sont jamais appelés.

    Tu peux les appeler explicitement par parent::__construct();

    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
    44
    45
    46
    47
    class A{
    	protected $a1, $a2;
     
    	function __construct( $p1 = 'Class A' , $p2 = 'Class A' ){
    		echo "Constructeur A\n";
    		$this->a1 = $p1;
    		$this->a2 = $p2;
    	}
    }
     
    abstract class B extends A{
    	protected $a3;
    	function __construct( $p = 'Class B' ){
    		echo "Constructeur B\n";
    		parent::__construct();		
    		$this->a3 = $p;
    	}
    }
     
    class C extends B{
    	protected $a4;
    	function __construct( $p1 , $p2 ){
    		echo "Constructeur C\n";
    		parent::__construct( $p1 );		
    		$this->a4 = $p2;
    	}
    }
     
    class D extends B{
    		protected $a4;
    	function __construct( $p1 , $p2 ){
    		echo "Constructeur D\n";	
    		$this->a4 = $p2;
    		$this->a3 = $p1;
    	}
    }
    $oA = new A();
     
    print_r( $oA );
     
    $oC = new C( 'CCC' , 'DDD' );
     
    print_r( $oC );
     
    $oD = new D( 'DDD' , 'EEE' );
     
    print_r( $oD );

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 20
    Par défaut
    J'ai fini par trouver mon erreur. Ne trouvant absolument rien sur google à ce sujet et vue l'incompréhension qui régnai sur ce poste j'ai fini par me dire que ça venait forcement d'ailleurs.

    En fait ça viens d'une fonction générique qui instance des classes différentes quelque part dans le code.

    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
    class D {
              protected $contenu[];
    //...
         protected function ajouter_objet($type) {
              $type = ucfirst($type);
              $objet = new $type($type);//l'erreur est ici
              $this->contenu[] = $objet;
              return $objet;
         public function c() {
              $objet = $this->ajouter_objet('c');
              return $objet;
         }
    }
     
    class C extends B {
         protected $attribut4;
         public function __construct($parametre1 = 'truc_par_defaut') {
              $this->attribut1 = 'truc';
              $this->attrbut2 = true;
              $this->attribut4 = $parametre1;
         }
    }
    et donc quand je fais un appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $objetD->c('coucou');
    Ca me renvoi forcement le nom de la classe alors j'ai pas compris

    C'est mon premier essaie avec les classes php, alors bon c'était noyé dans le code et sans message d'erreur c pas facile à trouver (php ne bronche même pas quand on lui donne des paramètres en trop).

    Alors voila ça n'a plus aucun rapport avec le sujet mais je répond précisément parce qu'on a fait l'effort de m'aider. @+

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

Discussions similaires

  1. [PHP 5.2] [POO] Constructeur avec paramètres et héritage
    Par yamayo dans le forum Langage
    Réponses: 4
    Dernier message: 11/01/2009, 21h40
  2. [POO] constructeur d'une class
    Par spirou dans le forum Langage
    Réponses: 13
    Dernier message: 05/07/2006, 17h11
  3. [POO] Constructeur et héritage
    Par LDDL dans le forum Langage
    Réponses: 3
    Dernier message: 23/05/2006, 22h44
  4. paramètre ... et héritage
    Par kinta dans le forum C++
    Réponses: 8
    Dernier message: 23/02/2006, 23h22
  5. [POO] Constructeur de classe
    Par cescu dans le forum Langage
    Réponses: 7
    Dernier message: 14/02/2006, 22h50

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