123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- --TEST--
- The weak part of the WeakMap
- --FILE--
- <?php
- $map = new WeakMap;
- // This is doing to be inserted into the map and immediately removed again
- $map[new stdClass] = 1;
- var_dump($map);
- $obj = new stdClass;
- $map[$obj] = 2;
- var_dump($map);
- unset($obj);
- var_dump($map);
- echo "\nDestructor in WeakMap value:\n";
- $obj = new stdClass;
- $map[$obj] = new class {
- public function __destruct() {
- echo "Dtor!\n";
- }
- };
- echo "Before unset:\n";
- unset($obj);
- echo "After unset:\n";
- var_dump($map);
- echo "\nDestroying map with live object:\n";
- $obj = new stdClass;
- $map[$obj] = 3;
- unset($map);
- var_dump($obj);
- echo "\nObject freed by GC:\n";
- $map = new WeakMap;
- $obj = new stdClass;
- $obj->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*
- }
- }
|