PHP 的 WeakMap 實作允許迭代 WeakMap 的內容,因此了解為何它有時很危險並且需要仔細考慮是很重要的。
如果 WeakMap 的物件是由其他服務(例如 Doctrine 的 EntityManager)管理,則永遠不能假設如果物件仍然存在於 WeakMap 中,它仍然由 Doctrine 管理,因此可以安全地使用。
Doctrine 可能已經丟棄了該實體,但一些不相關的程式碼片段可能仍然持有它的參考,因此它仍然存在於映射中。
如果您將受管理的物件放入 WeakMap 中,然後稍後迭代 WeakMap(例如,在 Doctrine flush 之後),那麼對於每個這樣的物件,您必須驗證它在物件來源的上下文中仍然有效。
例如,將分離的 Doctrine 實體分配給另一個實體的屬性將導致有關在階層中找到未保存/未管理的實體的錯誤。