Page 1 sur 1

Héritage du contenu des attributs

Posté : 01 août 2008, 11:22
par bombjack
Bonjour à tous

Pouvez-vous m'aider sur une intérrogation sur l'héritage des attributs en PHP5

pour faire voici une class (très simple)
class A { 

protected $articles; 

public __construct() 
{ 
$this->articles = array(); 
} 
public add_article($name) 
{ 
$this->articles[] = $name; 
} 
} 
autre class qui herite (Méthodes et Attributs) de A
class B extends A { 



public affiche() 
{ 
print_r($this->articles); 
} 
} 
index.php
$a=new A(); 
$a->add_article('pull'); 
$b=new B(); 
$b->affiche();


j'ai donc l'attribut 'articles' dans la class B (heriter de A) , mais le pull ajouter dans l'attribut de la class A à disparu dans la class B, mais pourquoi j'ai plus mon pull dans la class B ,
logiquement j'ai hérité de article de la class A. j'ai en faite un héritage d'attribut mais vide!!!!

pourquoi j'herite pas du contenu des attributs de la class PARENT???

Merci pour votre aide

Posté : 01 août 2008, 11:31
par oOSebOo
Salut,

Le fait d'instancier A, puis B, même si ta classe B hérite de A l'instance n'est pas la même.

Pour ma part je ferais comme ca :

Code : Tout sélectionner

class A { protected $articles; public __construct(){ $this->articles = array(); } protected add_article($name){ $this->articles[] = $name; } }

Code : Tout sélectionner

class B extends A { public __construct(){ /**** ici tu dit a ta classe B qu'elle doit instancier également A, du coup les propriétés public / protected de A sont dispo ***/ parent::_construct(); } public affiche(){ print_r($this->articles); } }
index.php

Code : Tout sélectionner

$obj = new B(); $obj->add_article('pull'); $obj->affiche();

Posté : 01 août 2008, 11:31
par Truc
Modération :
bombjack, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ

Re: Héritage du contenu des attributs

Posté : 01 août 2008, 12:49
par Calimero
Bonjour,
$a=new A(); 
$a->add_article('pull'); 
$b=new B(); 
$b->affiche();


j'ai donc l'attribut 'articles' dans la class B (heriter de A) , mais le pull ajouter dans l'attribut de la class A à disparu dans la class B, mais pourquoi j'ai plus mon pull dans la class B ,
logiquement j'ai hérité de article de la class A. j'ai en faite un héritage d'attribut mais vide!!!!
En fait tu confonds classe et objet. L'héritage se passe entre les classes, mais toi tu manipules deux objets différents (ici ils n'ont pas la même classe, mais même si c'était le cas, tu observerais le même comportement) :-)

Les appels de méthode via -> affectent l'objet appelant, pas la classe (sinon l'opérateur utilisé serait :: à la place de la flèche).

à partir du moment où tu crées un objet d'une classe ( new() ), l'objet mène sa propre vie indépendamment de sa classe. Tu ne manipules jamais la classe à partir de l'objet .

Posté : 01 août 2008, 13:46
par bombjack
Merci pour vos réponses , désolé modérateur pour les portions de code à délimités (PHP)

Ok pour le parent::__construct effectivement ça marche (uniquement si j'affecte des valeurs dans le contructeur parent!)

Mais il reste une chose clair dans ma tête

Donc impossible d'heriter du 'contenu' des attributs d'un (objet ou instance).

Si une (instance ou objet) A alimente ces attributs uniquement avec sa prope méthode

et pendant le déroulement du script normal de PHP j'alimente les attributs de l'instance A avec sa prope méthode.

nous sommes bien d'accord si je fait un héritage de cette (instance ou class) B extends A , B n'hérite pas du 'contenu' des attributs de l'instance A. (j'éspére être clair dans mes explications ;-))

Posté : 01 août 2008, 14:27
par oOSebOo
Il va hériter des valeurs 'par défaut' de tes attributs.

Pour reprendre l'exemple précédent, si tu met une valeur par défaut a ton articles ( ou que tu set via le constructeur ), cette valeur sera effectivement repris.

Sinon vu que les instances sont différentes, si tu instanci A, tu lui sette des propriétés, et ensuite tu instanci B, A ne prend pas les valeurs que tu lui as setté précédement, mais prend son comportant par défaut.
class A {
    public $articles;
    public __construct(){
        $this->articles = 'forum phpfrance';
    }
    protected add_article($name){
        $this->articles[] = $name;
    }
}
class B extends A {
    public __construct(){
        /**** ici tu dit a ta classe B qu'elle doit instancier également A, du coup les propriétés public / protected de A sont dispo ***/
        parent::_construct();
    }
    public affiche(){
        print_r($this->articles);
    }
}
$obj = new B();
echo $obj->articles;

Posté : 01 août 2008, 18:20
par bombjack
ok oOSebOo et merci à tous!

Posté : 01 août 2008, 18:27
par Truc
Modération :
bombjack, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.


Non je n'interviens pas que pour la modération... parfois j'aide aussi :wink: