Héritage du contenu des attributs

Petit nouveau ! | 5 Messages

01 août 2008, 11:22

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

Petit nouveau ! | 2 Messages

01 août 2008, 11:31

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();

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

01 août 2008, 11:31

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

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 2287 Messages

01 août 2008, 12:49

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 .
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 5 Messages

01 août 2008, 13:46

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 ;-))

Petit nouveau ! | 2 Messages

01 août 2008, 14:27

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;

Petit nouveau ! | 5 Messages

01 août 2008, 18:20

ok oOSebOo et merci à tous!

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

01 août 2008, 18:27

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:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute