PHP 对 WeakMap 的实现允许遍历弱映射的内容,因此了解为什么它有时很危险并且需要仔细考虑非常重要。
如果 WeakMap 的对象由其他服务(如 Doctrine 的 EntityManager)管理,那么永远不要假设如果对象仍然存在于弱映射中,它就仍然受 Doctrine 管理,因此可以安全地使用。
Doctrine 可能已经丢弃了该实体,但某些无关的代码可能仍然持有对它的引用,因此它也仍然存在于映射中。
如果您将受管理的对象放入 WeakMap,然后稍后遍历 WeakMap(例如,在 Doctrine 刷新之后),那么对于每个这样的对象,您必须验证它在对象的来源上下文中是否仍然有效。
例如,将分离的 Doctrine 实体分配给另一个实体的属性会导致有关在层次结构中找到未持久化/未管理的实体的错误。