你的原代码样品可以作为被重写。这意味着对象的封装被破坏。代码还预计,$sender
实际上将包含一个对象。
你可以提高封装,通过使用一个getter,而不是直接访问变量:$invoice->getSender()->getName();
但这种方法也被认为是一个code smell。这也会使调试非常烦人,并且经常导致违反Law of Demeter。
这样的链接被认为是不好的做法。我强烈建议避免它。
唯一的例外是常见的setter链接,当使用域实体时。在这种情况下,这将是我们经常见到这样的代码:
$invoice
->setSender('John Doe')
->setReceivedOn(time())
->setOrder($data);
为了实现它,这些方法很有点像这样定义:
public function setSender($sender) {
$this->sender = $sender;
return $this;
}
这种特殊的用例是不一样糟糕其他人,因为这个班级实际上并没有改变链接的链接(这使前两个例子的调试变成了一场噩梦)。但我个人仍然会避免这种做法,因为设置器不应该返回任何东西,并且获取器不应该更改对象的状态。
TL; DR:不采用这种风格的代码。
'$ object-> Something_1'的值本身就是一个对象。没有更多,没有更多。与$ array ['foo'] ['bar']''不同,它是数组中的数组。 – deceze