weakmap_weakness.phpt 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. --TEST--
  2. The weak part of the WeakMap
  3. --FILE--
  4. <?php
  5. $map = new WeakMap;
  6. // This is doing to be inserted into the map and immediately removed again
  7. $map[new stdClass] = 1;
  8. var_dump($map);
  9. $obj = new stdClass;
  10. $map[$obj] = 2;
  11. var_dump($map);
  12. unset($obj);
  13. var_dump($map);
  14. echo "\nDestructor in WeakMap value:\n";
  15. $obj = new stdClass;
  16. $map[$obj] = new class {
  17. public function __destruct() {
  18. echo "Dtor!\n";
  19. }
  20. };
  21. echo "Before unset:\n";
  22. unset($obj);
  23. echo "After unset:\n";
  24. var_dump($map);
  25. echo "\nDestroying map with live object:\n";
  26. $obj = new stdClass;
  27. $map[$obj] = 3;
  28. unset($map);
  29. var_dump($obj);
  30. echo "\nObject freed by GC:\n";
  31. $map = new WeakMap;
  32. $obj = new stdClass;
  33. $obj->obj = $obj;
  34. $map[$obj] = 4;
  35. unset($obj);
  36. var_dump($map);
  37. gc_collect_cycles();
  38. var_dump($map);
  39. echo "\nStoring object as own value:\n";
  40. $map = new WeakMap;
  41. $obj = new stdClass;
  42. $map[$obj] = $obj;
  43. unset($obj);
  44. var_dump($map);
  45. unset($map);
  46. echo "\nStoring map in itself:\n";
  47. $map = new WeakMap;
  48. $map[$map] = $map;
  49. var_dump($map);
  50. unset($map);
  51. ?>
  52. --EXPECT--
  53. object(WeakMap)#1 (0) {
  54. }
  55. object(WeakMap)#1 (1) {
  56. [0]=>
  57. array(2) {
  58. ["key"]=>
  59. object(stdClass)#2 (0) {
  60. }
  61. ["value"]=>
  62. int(2)
  63. }
  64. }
  65. object(WeakMap)#1 (0) {
  66. }
  67. Destructor in WeakMap value:
  68. Before unset:
  69. Dtor!
  70. After unset:
  71. object(WeakMap)#1 (0) {
  72. }
  73. Destroying map with live object:
  74. object(stdClass)#2 (0) {
  75. }
  76. Object freed by GC:
  77. object(WeakMap)#1 (1) {
  78. [0]=>
  79. array(2) {
  80. ["key"]=>
  81. object(stdClass)#3 (1) {
  82. ["obj"]=>
  83. *RECURSION*
  84. }
  85. ["value"]=>
  86. int(4)
  87. }
  88. }
  89. object(WeakMap)#1 (0) {
  90. }
  91. Storing object as own value:
  92. object(WeakMap)#3 (1) {
  93. [0]=>
  94. array(2) {
  95. ["key"]=>
  96. object(stdClass)#1 (0) {
  97. }
  98. ["value"]=>
  99. object(stdClass)#1 (0) {
  100. }
  101. }
  102. }
  103. Storing map in itself:
  104. object(WeakMap)#3 (1) {
  105. [0]=>
  106. array(2) {
  107. ["key"]=>
  108. *RECURSION*
  109. ["value"]=>
  110. *RECURSION*
  111. }
  112. }