PHP中WeakMap存储枚举值:枚举实例何时会被垃圾回收?
PHP枚举实例在WeakMap中的垃圾回收时机
结论:存于WeakMap中的枚举实例条目永远不会变得不可见/不可访问,因为枚举实例永远不会被垃圾回收。
原因如下:
- PHP的枚举case实例是全局单例,从程序启动到终止,PHP引擎会始终持有这些实例的强引用,不会将其标记为可回收的垃圾。
- WeakMap的核心特性是:当作为键的对象没有任何强引用存在时,该对象会被垃圾回收,对应的WeakMap条目也会被自动移除。但枚举实例的强引用由PHP引擎本身维护,永远不会被释放,所以完全不满足WeakMap键被回收的条件。
可以通过以下代码验证这一点:
enum MyEnum { case A; } $wm = new WeakMap(); $wm[MyEnum::A] = 'something'; // 手动触发垃圾回收 gc_collect_cycles(); // 检查WeakMap中对应条目是否存在 var_dump(isset($wm[MyEnum::A])); // 输出结果为 bool(true)
无论执行多少次垃圾回收操作,$wm[MyEnum::A]的条目都会持续存在,因为枚举实例的强引用始终存在。
内容的提问来源于stack exchange,提问作者Toskan
相关产品推荐
相关产品推荐

