我不正是明白你的意思,但是...
我想你需要的東西是這樣的:
class Case {
private $comment;
public function getComment() {
// Add some checks if necessary
...
return $this->comment;
}
public function addComment(Comment $comment) {
// Add some checks if necessary
...
$this->comment = $comment;
}
}
您也可以選擇讓你的$評論屬性格式保護。如果你想擴展對象,這是特別有用的。
總是大量使用封裝,這是OOP的最大優點之一。建立一個受保護的或私有的類屬性總是明智的。沒有它,當你設置屬性時,你不能強制檢查它。請記住,如果您將一個物業公開,每個類都可以在不進行任何檢查的情況下訪問和修改它。想想那可能的後果!
$評論是不是一個原始類型,其評論CLAS
好運的一個實例的引用!
@Gordon:沒關係。即使是評論的情況下,你把它公開,你仍然可以做到這一點是這樣的:
// $Case is a Case object, doh ;)...
$Case->comment = "Just a string value";
,突然你的評論是一種最原始的,而你希望評論類的實例...這可能會給你幾個錯誤。如果您將其設置爲受保護的或私有屬性,則在該類之外的代碼行是不可能的。然後,你不得不使用一個setter爲它想:
public function setComment(Comment $comment) {
...
}
你的函數需要一個評論,並在別的給出將拋出一個錯誤。這將確保你的對象是一致的。
@Gordon:這不是您在Case類中構建的Comment類方法。上述方法僅適用於您的Case類。他們唯一做的事情是獲取屬於Case類的Comment對象,並且設置屬於Case類的Comment對象。一旦你用getter成功地檢索了Comment對象,就可以觸發Comment類中定義的所有公共方法。所以它對Comment對象本身沒有任何作用。
您的評論仍然完全獨立。這些對象之間的關係(很可能)保存在Case對象的表中。你的案例類是唯一知道關係的類。因此,您仍可以將您的評論類用於其他目的。
你的案例類需要以某種方式知道你的評論類,這是要走的路!
順便說一句,考慮一個多對多的關係。我假設一個案例可以有更多的一個評論。
祝你好運!
$ comment不是原始類型,它是對註釋類實例的引用 – GordonM 2010-11-11 08:03:02
這將建議將註釋屬性設置爲私有類,並將註釋類方法包裝到宿主類中。我理解這給出的優點,但是雖然我對OOP相對陌生,但我的理解是,對象之外的其他對象之間的依賴關係被認爲是不好的? – GordonM 2010-11-11 09:15:54
多對多需求意味着某種內部評論集合。可能不僅僅是對私人評論對象的引用,您可能希望擁有您的Case方法可以管理的一系列評論。您可以修改您的個案,因爲有人建議添加和刪除收藏中的評論。您可能還需要通過ID或評論列表檢索特定評論的方法。你可能想要自己構建你的評論類,也許要進行單元測試,並讓它工作。然後添加Case方法來管理這些方法的集合。 – 2010-11-11 14:46:17