基于数据映射器的多态域对象

时间:2009-01-28 17:22:30

标签: php oop dns data-access-layer

我有一个基本的域对象,比如Person或Campaign或Event,它由数据库中的单个表表示。但是,我还有更复杂的这些对象版本,比如PersonCampaign或PersonEvent,甚至可以理论上扩展其中一个基础对象的CampaignEvent。

但是,由于多种原因,这变得很复杂,因为PHP不支持多重继承(例如PersonEvent扩展Person或Event)。还因为某些域对象实际上是具有不同属性和功能的工厂对象(例如,事件实际上是由电子邮件,呼叫,传真等事件类型划分的)。

我能看到的最简单的解决方案是根据数据访问层返回的数据来改变对象的实际性质。

有没有人对更好的方法有任何建议?或者创建统一域对象是否正确,这些对象可以根据数据访问层当前可用的内容更改属性和行为?

3 个答案:

答案 0 :(得分:2)

解决方案是封装其他对象:

PersonEvent类包含Person和Event。

可通过函数$ PersonEvent-> get_event()或属性$ PersonEvent->事件进行访问;

答案 1 :(得分: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的关系)

糟糕的是,这会使数据映射器复杂化或根本不使用数据映射器。

答案 2 :(得分:0)

如果设置如下:

表:人员,销售人员,客户人员等。 人员表存储关于所有子类型的一般信息。然后还有其他表FK到人员表。它存储有关该子类型的其他唯一信息。

你的对象要么扩展,要么调用泛型'person'对象来访问主数据,然后调用它的唯一类型对象来访问该子类型的唯一数据?