--TEST-- The weak part of the WeakMap --FILE-- obj = $obj; $map[$obj] = 4; unset($obj); var_dump($map); gc_collect_cycles(); var_dump($map); echo "\nStoring object as own value:\n"; $map = new WeakMap; $obj = new stdClass; $map[$obj] = $obj; unset($obj); var_dump($map); unset($map); echo "\nStoring map in itself:\n"; $map = new WeakMap; $map[$map] = $map; var_dump($map); unset($map); ?> --EXPECT-- object(WeakMap)#1 (0) { } object(WeakMap)#1 (1) { [0]=> array(2) { ["key"]=> object(stdClass)#2 (0) { } ["value"]=> int(2) } } object(WeakMap)#1 (0) { } Destructor in WeakMap value: Before unset: Dtor! After unset: object(WeakMap)#1 (0) { } Destroying map with live object: object(stdClass)#2 (0) { } Object freed by GC: object(WeakMap)#1 (1) { [0]=> array(2) { ["key"]=> object(stdClass)#3 (1) { ["obj"]=> *RECURSION* } ["value"]=> int(4) } } object(WeakMap)#1 (0) { } Storing object as own value: object(WeakMap)#3 (1) { [0]=> array(2) { ["key"]=> object(stdClass)#1 (0) { } ["value"]=> object(stdClass)#1 (0) { } } } Storing map in itself: object(WeakMap)#3 (1) { [0]=> array(2) { ["key"]=> *RECURSION* ["value"]=> *RECURSION* } }