2010-09-15 132 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