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] Héritage qui ne fonctionne pas


Sujet :

Langage PHP

  1. #1
    Membre du Club Avatar de eexit
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 50
    Points
    50
    Par défaut [POO] Héritage qui ne fonctionne pas
    Bonjour,

    J'ai un petit soucis d'héritage... Je n'ai pas énormément d'expérience en terme de POO mais là j'avoue que je ne comprends pas pourquoi ça ne fonctionne pas.

    Voici l'exemple:
    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
    <?php
    class Foo {
    	protected $foo;
    	protected $tata = 'titi';
    	public $bar;
     
    	function _init() {
    		$this->foo = 'toto';
    		$this->bar = new Bar;
    	}
    }
     
    class Bar extends Foo {
    	public $baz;
    	public $baz2;
     
    	function __construct() {
    		$this->baz = $this->foo;
    		$this->baz2 = $this->tata;
    	}
    }
     
    $foobar = new Foo;
    $foobar->_init();
    echo $foobar->bar->baz; // devrait retourner 'toto'
    echo $foobar->bar->baz2; // retourne 'titi'
    ?>
    Si quelqu'un peut m'expliquer pourquoi est-ce que j'arrive pas à acceder à la propriété $foo, cela me rendrait grandement service...
    Elle prends bien la valeur qu'on lui assigne mais apparemment, l'héritage ne suit pas

    Merci bien.

  2. #2
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    salut,
    La classe est instancié avec une nouvelle valeur qui est null donc il est normal de ne pas voir toto s'afficher.
    regarde voir un exemple très simple d'héritage :
    poo-php5-heritage

  3. #3
    Invité
    Invité(e)
    Par défaut
    c'est bizare que ça marche : vu qu'il y a une boucle infinie dans ton code ...

  4. #4
    Membre du Club Avatar de eexit
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 50
    Points
    50
    Par défaut
    Il n'y a aucune boucle...

    @Gats Merci pour l'info..


    Mais comment fais-je alors ?
    Par que si dans mon constructeur de Bar j'ai besoin de $foo, comment je peux lui transmettre sans lui filer en paramètre ?

    Merci.

  5. #5
    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
    Il n'y en à pas parceque PHP ne fait pas automatiquement appel au constructeur parent. Mais si c'était le cas, alors en faisant
    new Foo
    S'en suivrait, un new Bar, puis un new Foo, puis un new Bar ect ect ect

    Bien vu Bourgui.

    Si tu veux tester ajoute un parent::_construct() dans le ctor de Bar.

  6. #6
    Membre du Club Avatar de eexit
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 50
    Points
    50
    Par défaut
    Même si dans le constructeur de Bar je fais appel au constructeur de Foo (qui n'existe pas d'ailleurs), dans aucun des cas, ça ferait une boucle puisque l'instanciation de Bar se déroule dans la méthode _init();

    Sinon, ce serait sympa qu'on ne dérive pas du sujet.

    Merci.

  7. #7
    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
    oui enfin on tourne autour du sujet là...

    echo $foobar->bar->baz != toto car tout justement, _init n'est pas appelé depuis bar.
    Cependant si tu appelles bar::_init dans foo::__construct, ta question se trouve être résolue, mais on en arrive quand même à faire la boucle.

    bye

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oui c'est exactement ça, tu doit appeler le init, mais si tu l'appelle, ça fait une boucle

    ou dans le init tu fait $this->baz->foo = "titi";

    $foobar->bar->baz2; retourne "titi" car il a une valeur par défaut qui est donnée lors de l'appel au constructeur (avant l'appel)

    $foobar->bar->baz; retourne rien car quand tu l'initialise ($this->baz = $this->foo $this->foo n'a aucune valeur.

  9. #9
    Membre du Club Avatar de eexit
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 50
    Points
    50
    Par défaut
    Ouais ok, ça je sais.

    Mais je voudrais descendre dans les class, pas remonter. Dans ma fonction _init(), selon le paramètre qu'elle va recevoir, ce ne sera pas forcément Bar qui sera instancié mais Bar2 par exemple.

    Ensuite, Bar2 doit travailler tout seul grâce à l'héritage.. Le but est que Bar2 (ou Bar) puisse effectuer leurs tâches sans que j'ai à transmettre les propriétés de Foo préalabalement assignée.

    Instance de Foo avec paramètre -> selon le param -> Bar ou Bar2 avec traitement de param.

    Si je dois transmettre les propriétés, je ne vois pas du tout l'intéret de créer un héritage..

    Merci en tout cas pour vos réponses.

  10. #10
    Invité
    Invité(e)
    Par défaut
    si j'ai bien compris, tu veut faire un Foo, et en faire 2 bar dérivé, tout en ayant ton premier foo qui garde un handle vers le bar ?

    tu peut faire un constructeur de bar qui prend un foo en entrée, et s'initialize par rapport a celui ci.



    t'inquiète je pense qu'on aurait découvert depuis logntemp si l'héritage n'avais pas d'interet

  11. #11
    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
    Tu est certain de vouloir travailler avec de l'héritage là ?
    J'ai un peu de mal à saisir ce que tu veux faire mais l'héritage n'est peut être pas la voie la adaptée dans le mesure ou tu veux redescendre l'arbre.

  12. #12
    Membre du Club Avatar de eexit
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 50
    Points
    50
    Par défaut
    Je ne sais pas du tout si c'est ce que tu voulais dire mais j'ai trouvé la solution après reflection appronfondie sur la notion d'héritage ^^

    La voici :
    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
    <?php
    class Foo {
    	protected $foo;
    	protected $tata = 'titi';
    	public $bar;
     
    	function _init() {
    		$this->foo = 'toto';
    		$this->bar = new Bar($this);
    	}
    }
     
    class Bar extends Foo {
    	public $baz;
    	public $baz2;
     
    	function __construct($instance) {
    		$this->baz = $instance->foo;
    		$this->baz2 = $instance->tata;
    	}
    }
     
    $foobar = new Foo;
    $foobar->_init();
    echo $foobar->bar->baz; // retourne 'toto'
    echo $foobar->bar->baz2; // retourne 'titi'
    ?>
    Ca parait presque logique quand on y pense

    Merci en tout cas pour votre aide, vous m'avez aidé à approfondir mes notions d'héritage

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

Discussions similaires

  1. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08
  2. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. CREATEFILEMAPPING qui ne fonctionne pas???
    Par Jasmine dans le forum MFC
    Réponses: 2
    Dernier message: 06/01/2004, 19h33
  5. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04

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