【问题标题】:php object design parent childphp对象设计父子
【发布时间】:2017-05-07 04:28:04
【问题描述】:

我想在 php 中使用父/子类,但不使用子类。例如,假设我们有一个 House 类,而一个房子有 Doors 和 Windows。

class House {
}

class Door {
}

class Window {    
}

我们有两种类型的门,比如车库门和前门。

class GarageDoor extends Door {
}

class FrontDoor extends Door {
}

如何创建 House 和 Door 以及 House 和 Window 之间的关系,这样当我创建门时,必须至少有一个房子,并且我应该知道具体的房子。当我删除房子时,它的门窗也应该被删除。我该怎么做?

【问题讨论】:

  • 工厂模式将有助于以正确的方式管理对象的创建并使用依赖注入。观察者模式可以让你监听要解构的对象并执行一个动作。
  • 门是房屋中的一个组件,因此您可能需要在 House 中为 Door 对象(或 Door 对象数组,如果您有多个门)设置一个类属性。类似地,可以引用 House in the Door,尽管这可能会导致耦合,我认为这在这种情况下并不重要。

标签: php class oop extends


【解决方案1】:

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

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);

【讨论】:

  • 谢谢。它有很大帮助。我只更改了 House 的构造函数,因为我不喜欢没有门的房子。所以在 House 的构造函数中我添加了 $this->doors[] = new FrontDoor($this).
  • 在这种情况下,您还可以让 House 构造函数需要 FrontDoor:public function __construct(FrontDoor $frontDoor),这样您就可以控制房子正在使用哪个前门,因为如果不提供就无法创建新 House它是 FrontDoor :)
  • 虽然这会让你在我写的例子中遇到问题,因为你不能创建没有房子的门,也不能创建没有门的房子;)所以我们会想想依赖应该往哪个方向发展
猜你喜欢
  • 2011-04-21
  • 2011-06-05
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
相关资源
最近更新 更多