你的原代碼樣品可以作爲被重寫。這意味着對象的封裝被破壞。代碼還預計,$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