2009-01-28 29 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来访问;