2016-12-21 56 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