iterators_002.phpt 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. --TEST--
  2. ZE2 iterators and break
  3. --FILE--
  4. <?php
  5. class c_iter implements Iterator {
  6. private $obj;
  7. private $num = 0;
  8. function __construct($obj) {
  9. echo __METHOD__ . "\n";
  10. $this->obj = $obj;
  11. }
  12. function rewind(): void {
  13. echo __METHOD__ . "\n";
  14. $this->num = 0;
  15. }
  16. function valid(): bool {
  17. $more = $this->num < $this->obj->max;
  18. echo __METHOD__ . ' = ' .($more ? 'true' : 'false') . "\n";
  19. return $more;
  20. }
  21. function current(): mixed {
  22. echo __METHOD__ . "\n";
  23. return $this->num;
  24. }
  25. function next(): void {
  26. echo __METHOD__ . "\n";
  27. $this->num++;
  28. }
  29. function key(): mixed {
  30. echo __METHOD__ . "\n";
  31. switch($this->num) {
  32. case 0: return "1st";
  33. case 1: return "2nd";
  34. case 2: return "3rd";
  35. default: return "???";
  36. }
  37. }
  38. function __destruct() {
  39. echo __METHOD__ . "\n";
  40. }
  41. }
  42. class c implements IteratorAggregate {
  43. public $max = 3;
  44. function getIterator(): Traversable {
  45. echo __METHOD__ . "\n";
  46. return new c_iter($this);
  47. }
  48. function __destruct() {
  49. echo __METHOD__ . "\n";
  50. }
  51. }
  52. $t = new c();
  53. foreach($t as $k => $v) {
  54. foreach($t as $w) {
  55. echo "double:$v:$w\n";
  56. break;
  57. }
  58. }
  59. unset($t);
  60. print "Done\n";
  61. ?>
  62. --EXPECT--
  63. c::getIterator
  64. c_iter::__construct
  65. c_iter::rewind
  66. c_iter::valid = true
  67. c_iter::current
  68. c_iter::key
  69. c::getIterator
  70. c_iter::__construct
  71. c_iter::rewind
  72. c_iter::valid = true
  73. c_iter::current
  74. double:0:0
  75. c_iter::__destruct
  76. c_iter::next
  77. c_iter::valid = true
  78. c_iter::current
  79. c_iter::key
  80. c::getIterator
  81. c_iter::__construct
  82. c_iter::rewind
  83. c_iter::valid = true
  84. c_iter::current
  85. double:1:0
  86. c_iter::__destruct
  87. c_iter::next
  88. c_iter::valid = true
  89. c_iter::current
  90. c_iter::key
  91. c::getIterator
  92. c_iter::__construct
  93. c_iter::rewind
  94. c_iter::valid = true
  95. c_iter::current
  96. double:2:0
  97. c_iter::__destruct
  98. c_iter::next
  99. c_iter::valid = false
  100. c_iter::__destruct
  101. c::__destruct
  102. Done