使用嵌套类修改数组

时间:2016-12-29 15:49:49

标签: php oop nested

我有这个示例类

Class RealUrlConfig
{
    private $domains = [];

    public function addDomain($host, $root_id)
    {
        $this->domains[] = [
            'host' => $host,
            'rootpage_id' => $root_id,
        ];

        return $this; // <-- I added this
    }

    public function removeDomain($host)
    {
        foreach ($this->domains as $key => $item) {
            if ($item['host'] == $host) {
                unset($this->domains[$key]);
            }
        }
    }

    public function getDomains()
    {
        return $this->domains;
    }

    /**
     * TODO: I need this
     */
    public function addAlias($alias)
    {
        $last_modify = array_pop($this->domains);
        $last_modify['alias'] = $alias;

        $this->domains[] = $last_modify;
        return $this;
    }
}

现在我正在尝试创建一个向主机添加别名的选项。我可以提供原始主机名和别名并将其添加到数组中,但我试图在没有原始主机的情况下执行此操作 - 作为嵌套方法,以便我可以像这样执行它:

$url_config = new RealUrlConfig;

$url_config->addDomain('example.com', 1);
$url_config->addDomain('example2.com', 2)->addAlias('www.example2.com');

我将return $this添加到addDomain方法,以便它返回对象,但我不明白,我怎么知道要修改哪个数组,因为我得到整个对象。

当然,我可以从域数组中读取最后添加的域并修改它,但我不确定这是否正确。

1 个答案:

答案 0 :(得分:2)

您需要一个代表域的类,并且有一个addAlias方法。然后,您将返回而不是$this

别名是域的属性,因此逻辑上以这种方式对其进行建模是有意义的。

class Domain 
{
    // constructor not shown for brevity

    public function addAlias($alias)
    {
        $this->alias = $alias;
    }    
}

并在原来的课程中:

public function addDomain($host, $root_id)
{
    $domain = new Domain($host, $root_id);

    // optionally index the domains by the host, so they're easier to access later
    $this->domains[$host] = $domain;
    //$this->domains[] = $domain;

    return $domain;
}

如果您确实希望按主题索引它们,如上例所示,您可以稍微简化一下:

$this->domains[$host] = new Domain($host, $root_id);
return $this->domains[$host];

导致选项:

$url_config->addDomain('example2.com', 2)->addAlias('www.example2.com');

理想情况下,配置类不负责构建新的Domain对象,因为这违反了单一责任原则。相反,您可以在其中注入一个DomainFactory对象,该对象具有newDomain方法。

然后你有:

$this->domans[$host] = $this->domainFactory->newDomain($host, $root_id);
addDomain方法中的

我已将此与其余答案分开,因为依赖注入是一个更高级的主题。