PHP WeakMap特性的用法(附带实例)
PHP 8 新增 WeakMap 特性,也就是常说的弱映射。
WeakMap 允许创建对象到任意值的映射,同时也不会阻止作为键的对象被垃圾回收。如果某个对象键被垃圾回收,对应键值对将从集合中移除。
WeakMap 新特性非常有用,因为这样一来,开发者就不必担心代码存在内存泄露了。弱映射通常使用在将数据与单个对象实例关联起来,而不强制它们保持活动状态,引用的对象会在失效时自动被垃圾回收。
下面通过实例来理解 WeakMap 特性。
首先定义一个商品类和库房的类,然后看数组中使用情况。
如果想实现当对应的商品实例消失的时候,对其引用的类能自动感知。就像商品和库房的关系,如果商品销毁了,比如 unset($shaver),则对应的库房会被清除出来。注意这里把库房清除时,对应的商品是没事的,依旧存在。
下面就通过 WeakMap 来实现上述功能。代码如下:
WeakMap 允许创建对象到任意值的映射,同时也不会阻止作为键的对象被垃圾回收。如果某个对象键被垃圾回收,对应键值对将从集合中移除。
WeakMap 新特性非常有用,因为这样一来,开发者就不必担心代码存在内存泄露了。弱映射通常使用在将数据与单个对象实例关联起来,而不强制它们保持活动状态,引用的对象会在失效时自动被垃圾回收。
下面通过实例来理解 WeakMap 特性。
首先定义一个商品类和库房的类,然后看数组中使用情况。
<?php
class Goods{
public $name;
public function __construct($name) {
$this->name=$name;
}
}
class Storeroom{
public $rooms=[];
public function __construct() {
$this->rooms=[];
}
public function addGoods(Goods $goods) {
$this->rooms[$goods->name]=$goods;
}
}
$storeroom=new Storeroom();
$juicer=new Goods("果汁机");
$shaver=new Goods("剃须刀");
$storeroom->addGoods($juicer);
$storeroom->addGoods($shaver);
print_count($storeroom->rooms);
echo "<br />";
unset($shaver);
print_count($storeroom->rooms);
echo "<br />";
$storeroomShaver=$storeroom->rooms['剃须刀'];
echo $storeroomShaver->name;
?>
运行程序输出结果如下:
2
2
剃须刀
如果想实现当对应的商品实例消失的时候,对其引用的类能自动感知。就像商品和库房的关系,如果商品销毁了,比如 unset($shaver),则对应的库房会被清除出来。注意这里把库房清除时,对应的商品是没事的,依旧存在。
下面就通过 WeakMap 来实现上述功能。代码如下:
<?php
class Goods{
public $name;
public function __construct($name) {
$this->name=$name;
}
}
class Storeroom{
// 注意这里的数据类型
public WeakMap $rooms;
public function __construct() {
// 这里一定要对其进行实例化
$this->rooms=new WeakMap();
}
public function addGoods(Goods $goods) {
// 这里一定要以 Object 为索引
$this->rooms[$goods]=$goods->name;
}
}
$storeroom=new Storeroom();
$juicer=new Goods("果汁机");
$shaver=new Goods("剃须刀");
$storeroom->addGoods($juicer);
$storeroom->addGoods($shaver);
print count($storeroom->rooms);
echo "<br />";
// 删除其引用
unset($shaver);
print count($storeroom->rooms);
?>
运行程序输出结果如下:
2
1
ICP备案:
公安联网备案: