当前位置:  首页>> 技术小册>> PHP8入门与项目实战(4)

PHP 8新增WeakMap特性,也就是常说的弱映射。WeakMap允许创建对象到任意值的映射,同时也不会阻止作为键的对象被垃圾回收。如果某个对象键被垃圾回收,对应键值对将从集合中移除。这一新特性非常有用,因为这样一来,开发者就不必担心代码存在内存泄露了。弱映射通常使用在将数据与单个对象实例关联起来,而不强制它们保持活动状态,引用的对象会在失效时自动被垃圾回收。

下面通过实例来理解WeakMap特性。

首先定义一个商品类和库房的类,然后看数组中使用情况。

运行程序输出结果如下:

  1. 2
  2. 2
  3. 剃须刀

从结果可以看出,在使用数组时,将商品实例加入库房时,加入的是其克隆体,所以两者互相没有什么干扰。这里虽然使用了unset($shaver),但是没有对数组中的值产生了什么影响。

如果想实现当对应的商品实例消失的时候,对其引用的类能自动感知。就像商品和库房的关系,如果商品销毁了,比如unset($shaver),则对应的库房会被清除出来。注意这里把库房清除时,对应的商品是没事的,依旧存在。

下面就通过WeakMap来实现上述功能。代码如下:

运行程序输出结果如下:

  1. 2
  2. 1