我有这个示例类
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
方法,以便它返回对象,但我不明白,我怎么知道要修改哪个数组,因为我得到整个对象。
当然,我可以从域数组中读取最后添加的域并修改它,但我不确定这是否正确。
答案 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
方法中的。
我已将此与其余答案分开,因为依赖注入是一个更高级的主题。