php对象设计父-子对象

php对象设计父-子对象,php,class,oop,extends,Php,Class,Oop,Extends,我想在php中使用父/子类,但不是子类。例如,假设我们有一个班级的房子,一个有门有窗的房子 class House { } class Door { } class Window { } 我们有两种门,比如车库门和前门 class GarageDoor extends Door { } class FrontDoor extends Door { } 如何创建房屋和门以及房屋和窗户之间的关系,以便在创建门时,必须至少有一个房屋,并且我应该知道具体的房屋。当我删除一栋房子时,它的

我想在php中使用父/子类,但不是子类。例如,假设我们有一个班级的房子,一个有门有窗的房子

class House {
}

class Door {
}

class Window {    
}
我们有两种门,比如车库门和前门

class GarageDoor extends Door {
}

class FrontDoor extends Door {
}

如何创建房屋和门以及房屋和窗户之间的关系,以便在创建门时,必须至少有一个房屋,并且我应该知道具体的房屋。当我删除一栋房子时,它的门窗也应该被删除。我怎样才能做到这一点呢?

不是说这是最好的,甚至是一个很好的方法,但它应该给你一些可以玩的东西,让你自己尝试不同的东西:)


工厂模式将有助于以正确的方式管理对象的创建,并使用依赖项注入。观察者模式可以让您监听要解构的对象并执行操作。门是房屋中的一个组件,因此您可能希望房屋中的类属性用于门对象(如果有多个门,则需要门对象数组)。同样,也可以提到门上的房子,尽管这可能会导致耦合,我认为在这种情况下这并不重要。谢谢。这很有帮助。我只是换了房子的构造,因为我不喜欢没有门的房子。因此,在房屋的构造中,我添加了$this->doors[]=new FrontDoor($this)。在这种情况下,您还可以使房屋构造需要一个前门:
公共功能uu构造(FrontDoor$FrontDoor)
,这样您就可以控制房屋使用的前门,因为如果不给它一个前门,你就不能创建一个新房子:)尽管这会让你在我写的例子中遇到问题,因为你不能创建一个没有房子的门,也不能创建一个没有门的房子;)因此,这就是我们应该考虑的方向
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);