在PHP中,您可以从组成它的对象访问父对象吗?

时间:2011-09-30 20:24:32

标签: php oop design-patterns

我有一个FileCopier基类,它由两个与资源和资源目标相关联的“has-a”组成。

构造完成后,FileCopier中存在三个属性:

- Source (instance of Resource)
- Destination (instance of Resource)
- Config (array of configuration stuff for this FileCopier)

我在这个问题上找到的所有例子都是关于儿童的延伸,而不是儿童的组成。

我的问题是:资源实例有没有办法访问它的父母的“配置”?

或者,我是否必须通过构造函数将对父级的引用传递给它的相关子级?

3 个答案:

答案 0 :(得分:0)

答案取决于对象的责任。

如果两个资源都是由FileCopier对象创建的,则可以通过Resource类的构造函数从FileCopier提供配置(如果所有资源都应该具有配置 - 否则通过property / getter& setter)。

如果FileCopier是配置的东西,并且Resources将知道它当前正在使用的FileCopier(通过构造函数或属性),那么FileCopier应该只有getConfig()或者使用 - &gt ;如果属性是公共的,则配置。

从你的命名我看到实际的用例有点麻烦,资源必须知道对象的配置在资源本身上执行任何工作。将配置的这一部分(即,如果它是资源上的“保存”或“移动”命令)移动到实际的方法调用(并调用 - > save(),其中FileCopier对象使用来自的路径可能更好。它的配置。

答案 1 :(得分:0)

如果我正确地理解了这个问题,“父母”是错误的用语,尽管我知道你的意思。如果对象F是FileCopier的实例,并且具有两个属于instanceof Resource的属性,则对象F不是资源实例的父级。不太确定是什么叫这种关系,tbh:-o

您可以允许资源实例访问您的配置。在FileCopier类中执行类似的操作:

public function setSource(Resource $r)
{
    $this->Source = $r;
    $r->setConfig($this->Config);
}

这样可以透明地“通知”配置资源。

答案 2 :(得分:0)

如果我理解得很好,你有:

class FileCopier{
    /* @var Source */
    private $source;

    /* @var Destination */
    private $destination;

    /* @var Config */
    private $conf;

    ...

}

你想从$ source和$ destination访问$ conf? 没有父或其他魔术词来从其他两个变量访问此$ conf。 您最好的选择是向Resource添加一个函数,该函数将设置对Config的本地引用:

class Resource {
    /* @var Config */
    protected $config;
    ...
    function setConfig(Config $config) {
        $this->config = $config;
    }
    ...
}

或者,如果在某个其他位置设置了配置,则r可能会发生变化,或者如果由于其他原因您想从资源中访问最新的$ conf,您可以将参考号传递给FileCopier:

class Resource {
    /* @var FileCopier */
    protected $copier;
    ...
    function setFileCopier(FileCopier $copier) {
        $this->copier = $copier;
        // and access to $this->copier->conf through a getter
        // or make $conf public in FileCopier
    }
    ...
}

然后你要做的就是在使用$ source和$ destination之前调用你的setter。可能在FileCopier中:

class FileCopier{
    ...
    //first case :
    function setConfig($config) {
        $this->config = $config;
        $this->source->setConfig($config);
        $this->destination->setConfig($config);
    }

    // Or for the second case:
    function setup() {
        $this->source = new Source();
        $this->source->setFileCopier($this);

        $this->destination = new Destination();
        $this->destination->setFileCopier($this);
    }

    ...

}

希望这有帮助。