В PHP вы можете получить доступ к родительскому объекту из объекта, из которого он состоит? - PullRequest
0 голосов
/ 01 октября 2011

У меня есть базовый класс FileCopier, который состоит из двух ассоциаций has-a с источником ресурса и назначением ресурса.

После создания в FileCopier существуют три свойства:

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

Все примеры, которые я нахожу по этому вопросу, касаются детей по расширению, а не детей по составу.

Мой вопрос: есть ли способ для экземпляра Resource получить доступ к "Config" своего родителя?

Или я должен передать ссылку на родителя ассоциированным дочерним элементам, скажем, через конструктор?

Ответы [ 3 ]

0 голосов
/ 01 октября 2011

Если я правильно понял вопрос, «родитель» - неправильный термин, хотя я знаю, что вы имеете в виду.Если объект F является экземпляром FileCopier и имеет два свойства, которые оба являются экземплярами Resource, тогда объект F не является родительским для экземпляров ресурса.Не совсем уверен, как называется эта связь, tbh: -o

Вы можете разрешить экземплярам ресурсов доступ к вашей конфигурации.Сделайте что-то подобное в своем классе FileCopier:

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

Таким образом, ресурс может быть «уведомлен» о конфигурации прозрачным образом.

0 голосов
/ 01 октября 2011

Если я хорошо понимаю, у вас есть:

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

    /* @var Destination */
    private $destination;

    /* @var Config */
    private $conf;

    ...

}

А вы хотите получить доступ к $ conf из $ source и $ destination? Нет родительского или другого волшебного слова для доступа к этой переменной $ 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. Возможно в 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);
    }

    ...

}

Надеюсь, это поможет.

0 голосов
/ 01 октября 2011

Ответ зависит от обязанностей ваших объектов.

Если оба ресурса созданы объектом FileCopier, вы можете предоставить конфигурацию из FileCopier через конструктор класса Resource (если все ресурсы должны иметьконфигурация - иначе через свойство / получатель и установщик).

Если FileCopier - это то, что настраивается, и Ресурсы узнают о FileCopier, в котором он в настоящее время используется (либо через конструктор, либо через свойство), то FileCopier должен просто иметь getConfig () илииспользуйте -> config, если свойство общедоступно.

По вашим именам у меня возникли некоторые затруднения, когда я вижу фактический вариант использования, когда ресурс должен знать конфигурацию объекта, выполняющего любую работу над самим ресурсом.Возможно, было бы лучше переместить эту часть конфигурации (т. Е. Если это команда «сохранить» или «переместить» на ресурсе) в фактический вызов метода (и вызвать -> save (), где объект FileCopier использует путь из своегоконфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...