weakmap 是 php 8.0 引入的内置类,用于弱引用映射,避免因缓存或绑定导致的对象内存泄漏;支持数组式访问,仅接受对象作键,自动清理失效条目。

PHP 8.0 引入的 WeakMap 不是“内置函数”,而是一个内置类,用于实现弱引用映射。它本身不提供传统意义上的“函数调用接口”,但通过其方法(如 offsetSet、offsetGet)和语言特性(如数组式访问),能解决特定内存管理问题。它的核心价值在于避免因元数据持有对象引用而导致的内存泄漏,尤其适用于长期运行的进程。
缓存对象衍生数据,不延长对象生命周期
当你需要为某个对象(比如一个实体模型、DTO 或配置对象)临时缓存计算结果(如序列化后的 JSON 字符串、格式化后的显示名、校验状态等),又不希望这个缓存阻止对象被垃圾回收时,WeakMap 是理想选择。
- 普通数组或 SplObjectStorage 会强引用 key 对象,导致即使对象本该销毁,仍因缓存存在而滞留内存
- WeakMap 中的对象 key 被销毁后,对应条目自动消失,无需手动清理
- 适合在 ORM 实体监听器、模板渲染器、API 响应构造器中缓存中间结果
管理监听器或回调与对象的绑定关系
在事件驱动架构中,常需将监听器注册到某个对象上(例如:“当用户对象被修改时通知日志服务”)。若用常规数组保存 [userObj => [$logger, $notifier]],userObj 就无法被释放。
- WeakMap 允许你把监听器列表作为 value 绑定到对象 key 上,对象一销毁,绑定自动解除
- 避免了手动维护“反注册”逻辑,降低遗漏风险
- 特别适用于 ReactPHP、Swoole、Amp 等常驻内存框架中的事件订阅管理
附加调试或运行时元数据(仅开发/诊断场景)
在调试器、性能分析器或 AOP 工具中,有时需为对象动态添加追踪 ID、进入时间戳、调用栈快照等信息。
- 这些元数据只服务于诊断目的,不应影响应用本身的内存行为
- 使用 WeakMap 可确保调试信息随目标对象一同消亡,不会造成生产环境内存缓慢增长
- 比 __debugInfo() 更灵活,支持任意结构化数据,且不影响序列化行为
替代 SplObjectStorage 的轻量级对象标识映射
SplObjectStorage 功能更全(支持迭代、序列化、对象重复检测),但也更重;而 WeakMap 更专注、更高效,且天然支持 foreach 和 count()。
- 如果你只需要“以对象为键存取值”,不需要对象去重或自定义哈希逻辑,WeakMap 更简洁
- 它实现了
ArrayAccess、Countable、IteratorAggregate,可像数组一样使用:$map[$obj] = $data; - 注意:不能用字符串、数字或 null 作 key,必须是 object 实例
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











