PHP родительские и дочерние отношения - PullRequest
1 голос
/ 16 сентября 2010
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);

Я бы хотел, чтобы подкласс отредактировал базовые переменные $this->c = 'blabla';

как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

Почему бы просто не переопределить это:

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

В противном случае, если вам нужно изменить фактическое базовое свойство, используйте parent, как предложил Wrikken.

1 голос
/ 16 сентября 2010

это не был бы код, которым я гордился (разные сигнатуры конструктора), но это сработало бы (одноразовое использование):

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';
 }
}

Если вам это нужно чаще:

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(){
 }
}

В зависимости от реальных потребностей, вероятно, подойдет другой шаблон проектирования.

...