iterators_003.phpt 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. }
  15. function valid(): bool {
  16. $more = $this->num < $this->obj->max;
  17. echo __METHOD__ . ' = ' .($more ? 'true' : 'false') . "\n";
  18. return $more;
  19. }
  20. function current(): mixed {
  21. echo __METHOD__ . "\n";
  22. return $this->num;
  23. }
  24. function next(): void {
  25. echo __METHOD__ . "\n";
  26. $this->num++;
  27. }
  28. function key(): mixed {
  29. return $this->num;
  30. }
  31. }
  32. class c implements IteratorAggregate {
  33. public $max = 4;
  34. function getIterator(): Traversable {
  35. echo __METHOD__ . "\n";
  36. return new c_iter($this);
  37. }
  38. }
  39. $t = new c();
  40. foreach($t as $v) {
  41. if ($v == 0) {
  42. echo "continue outer\n";
  43. continue;
  44. }
  45. foreach($t as $w) {
  46. if ($w == 1) {
  47. echo "continue inner\n";
  48. continue;
  49. }
  50. if ($w == 2) {
  51. echo "break inner\n";
  52. break;
  53. }
  54. echo "double:$v:$w\n";
  55. }
  56. if ($v == 2) {
  57. echo "break outer\n";
  58. break;
  59. }
  60. }
  61. print "Done\n";
  62. ?>
  63. --EXPECT--
  64. c::getIterator
  65. c_iter::__construct
  66. c_iter::rewind
  67. c_iter::valid = true
  68. c_iter::current
  69. continue outer
  70. c_iter::next
  71. c_iter::valid = true
  72. c_iter::current
  73. c::getIterator
  74. c_iter::__construct
  75. c_iter::rewind
  76. c_iter::valid = true
  77. c_iter::current
  78. double:1:0
  79. c_iter::next
  80. c_iter::valid = true
  81. c_iter::current
  82. continue inner
  83. c_iter::next
  84. c_iter::valid = true
  85. c_iter::current
  86. break inner
  87. c_iter::next
  88. c_iter::valid = true
  89. c_iter::current
  90. c::getIterator
  91. c_iter::__construct
  92. c_iter::rewind
  93. c_iter::valid = true
  94. c_iter::current
  95. double:2:0
  96. c_iter::next
  97. c_iter::valid = true
  98. c_iter::current
  99. continue inner
  100. c_iter::next
  101. c_iter::valid = true
  102. c_iter::current
  103. break inner
  104. break outer
  105. Done