2010-09-15 124 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); 

我想子类编辑基地瓦尔$this->c = 'blabla';PHP OOP父母和孩子之间的关系

我怎样才能做到这一点?

+0

它看起来像我混淆了**继承**(孩子延伸父母)和**构成**(一个对象持有对另一个引用)的概念。但也许不是。你能解释你为什么要做这种事吗? – grossvogel 2010-09-15 23:02:34

回答

1

为什么不重写它:

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

否则,如果您需要修改实际的基础属性,使用parent作为Wrikken建议。

1

“T不会是我的代码是(不同的构造函数签名)感到骄傲,但是这会工作(一次性使用):

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

根据实际需要,另一种设计模式可能更适合。

+0

我将不得不这样做每个功能...这将是一个hushle – Val 2010-09-15 21:25:49

+0

如果你必须为每个函数做到这一点,可能'sub'属性实际上不是你想要的,你想要适当的多态性。这里的用例是什么,你想要解决什么? (顺便说一句,你可以在构造函数中设置一个'parent'属性,这样你就可以随时获得一个参考) – Wrikken 2010-09-15 21:32:01

+0

很好的基础是,根obj,我正在考虑相应地扩展它。但使用我想使用“$ this”来引用“基本”类,即使它是在孩子或大孩子。 – Val 2010-09-15 21:34:23