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