(PHP 8)
Класс WeakMap — карта, или словарь, который принимает объекты как ключи. Но, в отличие от аналогичного в остальном класса SplObjectStorage, PHP не учитывает объект в ключе карты WeakMap при подсчёте ссылок на объект. Поэтому, как только единственной ссылкой на объект останется ключ в экземпляре класса WeakMap, сборщик мусора соберёт и удалит объект из хранилища WeakMap. Главное назначение класса — создавать кеши данных, которые получили из объекта и которым не требуется жить дольше, чем сам объект.
Класс WeakMap реализует интерфейсы ArrayAccess, Traversable (через интерфейс IteratorAggregate) и Countable, поэтому работает как ассоциативный массив: поддерживает обход, доступ по ключу и подсчёт элементов.
Пример #1 Пример уничтожения записи из хранилища WeakMap при удалении внешнего объекта
<?php
$wm = new WeakMap();
$o = new stdClass();
class A
{
public function __destruct()
{
echo "Уничтожено!\n";
}
}
$wm[$o] = new A();
var_dump(count($wm));
echo "Сброс...\n";
unset($o);
echo "Готово\n";
var_dump(count($wm));Результат выполнения приведённого примера:
int(1) Сброс... Уничтожено! Готово int(0)