2016-12-21 58 views
1

我想在php中使用父/子類,但不是以子類的方式。舉個例子,假設我們有一個班級的房子,而一所房子有門和窗戶。php對象設計父子

class House { 
} 

class Door { 
} 

class Window {  
} 

而我們有兩種類型的門,比方說車庫門和前門。

class GarageDoor extends Door { 
} 

class FrontDoor extends Door { 
} 

如何創建衆議院和門之間和衆議院和窗口之間,這樣當我創建一個門的關係,必須有至少一個房子,我應該知道具體的房子。當我刪除房屋時,它的門窗也應該刪除。我怎樣才能做到這一點?

+0

工廠模式,將有助於試驗以正確的方式管理對象的創建並使用依賴注入。觀察者模式可以讓您監聽要解構的對象並執行操作。 –

+0

門是房屋中的組件,因此您可能需要House for Door對象(或門對象數組,如果您有多個門)中的類屬性。同樣,可以參考門中的房子,雖然這可能會導致耦合,在這種情況下我認爲不重要。 – SOFe

回答

2

不是說這是最好的,甚至一個很好的方式去了解它,但它應該給你的東西一起玩,並試着讓自己接觸不同的東西:)

class House 
{ 
    /** 
    * An array of all doors that have been installed in the house. 
    */ 
    private $doors = []; 

    /** 
    * You can install a door in a house. 
    */ 
    public function installDoor(Door $door) 
    { 
     $this->doors[] = $door; 
    } 
} 

class Door 
{ 
    /** 
    * A reference to the house this door is installed in. 
    */ 
    private $house = null; 

    /** 
    * A house is required before a door can be created. 
    */ 
    public function __construct(House $house) 
    { 
     $house->installDoor($this); 
     $this->house = $house; 
    } 
} 

$house = new House(); 
$door = new Door($house); 
+0

謝謝。它幫助了很多。我只改變了House的構造函數,因爲我不喜歡沒有門的房子。所以在House的構造函數中我添加了$ this-> doors [] = new FrontDoor($ this)。 –

+0

在這種情況下,你也可以讓House構造函數需要一個FrontDoor:'public function __construct(FrontDoor $ frontDoor)',這樣你就可以控制房子正在使用的前門,因爲你不能創建一個新房子它是一個FrontDoor :) – martindilling

+0

儘管這會讓你遇到我寫的例子的問題,因爲你無法創建一個沒有房子的門,也無法創建一個沒有門的房子;)那麼當我們想到什麼方向依賴關係應該去 – martindilling