我有这样的场景:
- 对象A有一定的参考其他对象的B,C,d
- 对象B有一些参考其他对象A,F,G
- 对象C具有一定的参考其他对象的,...
等等。
在我的代码,我需要做出的TMP的原因(不,我不能使用不同的结构,我需要有对象的副本)的对象(比如A)的“副本”。
如果我使用clone
,很明显,我做我的对象,但与他有关对象的克隆,不是克隆。
我perfeclty知道我可以重写魔方法__clone()
以便分配给-从一个目标点- B,C,d为对象的克隆本身,而是我有这么多的对象(和其中许多载到ArrayCollection
教义目的),我宁愿避免每个对象的clone功能的覆盖。
另外,我认为我可以从教义重新获取一个目的是使一个新的,以这种方式:
$aCopy = $this->entity_manager
->getRepository('MyBundle:A')
->find($a->getId());
其中$a
是实例class A
在执行此操作之后- 这当然是“错误的”,因为我怀疑主义将标志着该对象为“alredy牵强”,并返回其指针()* -我简单地打印我的两个对象与ID spl_object_hash()
函数,当然再次,它们指的是相同的对象ID,所以对相同的对象。
PS:
我不能使用学说detach()
函数,因为我需要提供原始对象此操作后
题
我怎样才能解决这种情况呢? 正如你所看到的,我tryied两种不同的方式,并没有她们其中一人能让我满意。
注意
我标记PHP也,因为如果有人可以点我到一个不同的解决方案,PHP的基于纯,我会考虑到这一点也
(*)
在这种情况下,第二条是从实体管理器访问两次,但在两者之间进行修改。 原则2实现这一点,将只给你访问的第一个实例ID为1234,不管你是否经常从EntityManager的检索,甚至不管你用的是什么样的查询方法(查找,资源库Finder或DQL)。 这就是所谓的“标识映射”的格局,这意味着主义保持地图已经每PHP请求检索每个实体和ID,并保持你返回相同的实例。
这证实了我以前说