2009-01-28 49 views
0

我有一個基本的域對象,就像人或活動或事件,由數據庫中的單個表示。不過,我也有更復雜的這些對象的版本,像PersonCampaign或PersonEvent,甚至CampaignEvent,理論上可以擴展其中一個基礎對象。基於數據映射器的多態域對象

但是,由於許多原因,這變得很複雜,因爲PHP不支持多重繼承(例如PersonEvent擴展Person或Event)。另外還因爲一些域對象實際上是具有不同屬性和功能的工廠對象(例如,事件實際上由諸如電子郵件,電話,傳真等類型的事件分類)。

我能看到的最簡單的解決方案是根據從數據訪問層返回的數據來改變對象的實際性質。

有沒有人有更好的方式來處理這個問題的任何建議?或者,創建統一的域對象是否正確,這些對象可以根據數據訪問層當前可用的內容來更改屬性和行爲?

回答

1

從OOP的角度來看,PersonEvent並不是一個真正的對象,它是一種關係。

Person類可以得到類似的功能:

get_events() 
add_event($Event) 
remove_event($Event) 

和事件類

get_person() 
set_person($Person) 
unset_person() // set person_id to NULL 

(假設1:N個人和事件之間的關係)

壞的部分是這會使數據映射器複雜化,或根本不使用數據映射器。

0

大約有像設置什麼:

表:人,銷售人員,客戶人員等。 的人表用於存儲所有子類型的人的一般信息。然後還有其他桌子FK'd人桌。它存儲有關該子類型的附加獨特信息。

您的對象要麼擴展,要麼調用通用的'person'對象來訪問主數據,然後調用它的唯一類型對象來訪問該子類型的唯一數據?

2

一種解決方案是包封的其它目的:

的PersonEvent類包含一個人與一個事件。

可以通過函數$ PersonEvent-> get_event()或屬性$ PersonEvent-> Event來訪問;