iterator_047.phpt 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. --TEST--
  2. SPL: RecursiveCachingIterator and exception in has/getChildren
  3. --FILE--
  4. <?php
  5. class MyRecursiveArrayIterator extends RecursiveArrayIterator
  6. {
  7. static public $fail = 0;
  8. static function fail($state, $method): void
  9. {
  10. if (self::$fail == $state)
  11. {
  12. throw new Exception("State $state: $method()");
  13. }
  14. }
  15. function hasChildren(): bool
  16. {
  17. echo __METHOD__ . "()\n";
  18. self::fail(1, __METHOD__);
  19. return parent::hasChildren();
  20. }
  21. function getChildren(): ?RecursiveArrayIterator
  22. {
  23. echo __METHOD__ . "()\n";
  24. self::fail(2, __METHOD__);
  25. return parent::getChildren();
  26. }
  27. }
  28. class MyRecursiveCachingIterator extends RecursiveCachingIterator
  29. {
  30. function show()
  31. {
  32. MyRecursiveArrayIterator::$fail = 0;
  33. while(MyRecursiveArrayIterator::$fail < 4)
  34. {
  35. echo "===" . MyRecursiveArrayIterator::$fail . "===\n";
  36. try
  37. {
  38. foreach(new RecursiveIteratorIterator($this) as $k => $v)
  39. {
  40. var_dump($k);
  41. var_dump($v);
  42. }
  43. }
  44. catch (Exception $e)
  45. {
  46. echo "Exception: " . $e->getMessage() . " in " . $e->getFile() . " on line " . $e->getLine() . "\n";
  47. }
  48. MyRecursiveArrayIterator::$fail++;
  49. }
  50. }
  51. }
  52. $it = new MyRecursiveArrayIterator(array(0, array(10), 2, array(30), 4));
  53. $it = new MyRecursiveCachingIterator($it);
  54. $it->show();
  55. ?>
  56. --EXPECTF--
  57. ===0===
  58. MyRecursiveArrayIterator::hasChildren()
  59. int(0)
  60. int(0)
  61. MyRecursiveArrayIterator::hasChildren()
  62. MyRecursiveArrayIterator::getChildren()
  63. Warning: Array to string conversion in %s on line %d
  64. MyRecursiveArrayIterator::hasChildren()
  65. int(0)
  66. int(10)
  67. MyRecursiveArrayIterator::hasChildren()
  68. int(2)
  69. int(2)
  70. MyRecursiveArrayIterator::hasChildren()
  71. MyRecursiveArrayIterator::getChildren()
  72. Warning: Array to string conversion in %s on line %d
  73. MyRecursiveArrayIterator::hasChildren()
  74. int(0)
  75. int(30)
  76. MyRecursiveArrayIterator::hasChildren()
  77. int(4)
  78. int(4)
  79. ===1===
  80. MyRecursiveArrayIterator::hasChildren()
  81. Exception: State 1: MyRecursiveArrayIterator::hasChildren() in %s on line %d
  82. ===2===
  83. MyRecursiveArrayIterator::hasChildren()
  84. int(0)
  85. int(0)
  86. MyRecursiveArrayIterator::hasChildren()
  87. MyRecursiveArrayIterator::getChildren()
  88. Exception: State 2: MyRecursiveArrayIterator::getChildren() in %s on line %d
  89. ===3===
  90. MyRecursiveArrayIterator::hasChildren()
  91. int(0)
  92. int(0)
  93. MyRecursiveArrayIterator::hasChildren()
  94. MyRecursiveArrayIterator::getChildren()
  95. Warning: Array to string conversion in %s on line %d
  96. MyRecursiveArrayIterator::hasChildren()
  97. int(0)
  98. int(10)
  99. MyRecursiveArrayIterator::hasChildren()
  100. int(2)
  101. int(2)
  102. MyRecursiveArrayIterator::hasChildren()
  103. MyRecursiveArrayIterator::getChildren()
  104. Warning: Array to string conversion in %s on line %d
  105. MyRecursiveArrayIterator::hasChildren()
  106. int(0)
  107. int(30)
  108. MyRecursiveArrayIterator::hasChildren()
  109. int(4)
  110. int(4)