2010-09-15 13 views
1
class base{ 
public $c = 'c'; 
public $sub = ''; 
function __construct(){ 
    $this->sub = new sub(); 
} 
} 

class sub extends base{ 
public $ab = 'abs'; 
function __construct(){ 
    $this->c = 'aas'; 
    echo 'Test'; 
} 
} 


$a = new base(); 
print_r($a); 

Je voudrais la sous-classe pour modifier la base vars $this->c = 'blabla';parent php POO à la relation de l'enfant

comment puis-je y parvenir?

+0

Il me semble que vous confondez les notions de ** héritage ** (enfant étend parent) et ** composition ** (un objet contient une référence à un autre). Peut-être pas, cependant. Pouvez-vous expliquer pourquoi vous voulez faire ce genre de chose? – grossvogel

Répondre

1

Pourquoi ne pas simplement la remplacer:

class sub extends base 
{ 
    public $ab = 'abs'; 
    public $c = 'blabla'; 
} 

Sinon, si vous avez besoin de modifier la propriété de base réelle, utilisez parent comme suggéré Wrikken.

1

« t ne serait pas le code, je suis fier de (différentes signatures du constructeur), mais cela fonctionnerait (usage unique):

class base{ 
public $c = 'c'; 
public $sub = ''; 
function __construct(){ 
    $this->sub = new sub($this); 
} 
} 

class sub extends base{ 
public $ab = 'abs'; 
function __construct($parent){ 
    $parent->c = 'aas'; 
    echo 'Test'; 
} 
} 

Si vous avez besoin plus souvent:

class base{ 
private $parent; 
private $top; 
public $c = 'c'; 
public $sub = ''; 
function __construct(base $parent = null, base $top = null){ 
    $this->parent = $parent; 
    $this->top = $top; 
    $this->addSub(); 
} 
function addSub(){ 
    $this->sub = new sub($this,$this->top ? $this->top : $this); 
} 

} 

class sub extends base{ 
public $ab = 'abs'; 
function __construct($parent,$top){ 
    parent::__construct($parent,$top); 
    $this->parent->c = 'aas'; 
} 
function foo($bar){ 
    $this->top->c = $bar; 
} 
//preventing infinite recursion.... 
function addSub(){ 
} 
} 

Selon les besoins réels, un autre modèle de conception est probablement plus adapté.

+0

je devrais faire cela pour chaque fonction ... ce qui serait un hussle – Val

+0

Si vous devez faire cela pour chaque fonction, probablement la propriété 'sub' n'est pas réellement ce que vous voulez, et vous voulez un polymorphisme approprié. Quel est le cas d'utilisation ici, qu'essayez-vous de résoudre? (Et en passant, vous pouvez bien sûr définir une propriété 'parent' dans le constructeur afin que vous ayez une référence à portée de main) – Wrikken

+0

bien base serait, la racine obj et je pensais à l'étendre en conséquence. mais utilisez je voudrais utiliser "$ this" pour se référer à la classe "base" même si c'est sur l'enfant ou grand enfant. – Val