iterators_001.phpt 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. --TEST--
  2. ZE2 iterators and foreach
  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->num = 0;
  11. $this->obj = $obj;
  12. }
  13. function rewind(): void {
  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. echo __METHOD__ . "\n";
  30. switch($this->num) {
  31. case 0: return "1st";
  32. case 1: return "2nd";
  33. case 2: return "3rd";
  34. default: return "???";
  35. }
  36. }
  37. }
  38. class c implements IteratorAggregate {
  39. public $max = 3;
  40. function getIterator(): Traversable {
  41. echo __METHOD__ . "\n";
  42. return new c_iter($this);
  43. }
  44. }
  45. echo "===Array===\n";
  46. $a = array(0,1,2);
  47. foreach($a as $v) {
  48. echo "array:$v\n";
  49. }
  50. echo "===Manual===\n";
  51. $t = new c();
  52. for ($iter = $t->getIterator(); $iter->valid(); $iter->next()) {
  53. echo $iter->current() . "\n";
  54. }
  55. echo "===foreach/std===\n";
  56. foreach($t as $v) {
  57. echo "object:$v\n";
  58. }
  59. echo "===foreach/rec===\n";
  60. foreach($t as $v) {
  61. foreach($t as $w) {
  62. echo "double:$v:$w\n";
  63. }
  64. }
  65. echo "===foreach/key===\n";
  66. foreach($t as $i => $v) {
  67. echo "object:$i=>$v\n";
  68. }
  69. print "Done\n";
  70. exit(0);
  71. ?>
  72. --EXPECT--
  73. ===Array===
  74. array:0
  75. array:1
  76. array:2
  77. ===Manual===
  78. c::getIterator
  79. c_iter::__construct
  80. c_iter::valid = true
  81. c_iter::current
  82. 0
  83. c_iter::next
  84. c_iter::valid = true
  85. c_iter::current
  86. 1
  87. c_iter::next
  88. c_iter::valid = true
  89. c_iter::current
  90. 2
  91. c_iter::next
  92. c_iter::valid = false
  93. ===foreach/std===
  94. c::getIterator
  95. c_iter::__construct
  96. c_iter::valid = true
  97. c_iter::current
  98. object:0
  99. c_iter::next
  100. c_iter::valid = true
  101. c_iter::current
  102. object:1
  103. c_iter::next
  104. c_iter::valid = true
  105. c_iter::current
  106. object:2
  107. c_iter::next
  108. c_iter::valid = false
  109. ===foreach/rec===
  110. c::getIterator
  111. c_iter::__construct
  112. c_iter::valid = true
  113. c_iter::current
  114. c::getIterator
  115. c_iter::__construct
  116. c_iter::valid = true
  117. c_iter::current
  118. double:0:0
  119. c_iter::next
  120. c_iter::valid = true
  121. c_iter::current
  122. double:0:1
  123. c_iter::next
  124. c_iter::valid = true
  125. c_iter::current
  126. double:0:2
  127. c_iter::next
  128. c_iter::valid = false
  129. c_iter::next
  130. c_iter::valid = true
  131. c_iter::current
  132. c::getIterator
  133. c_iter::__construct
  134. c_iter::valid = true
  135. c_iter::current
  136. double:1:0
  137. c_iter::next
  138. c_iter::valid = true
  139. c_iter::current
  140. double:1:1
  141. c_iter::next
  142. c_iter::valid = true
  143. c_iter::current
  144. double:1:2
  145. c_iter::next
  146. c_iter::valid = false
  147. c_iter::next
  148. c_iter::valid = true
  149. c_iter::current
  150. c::getIterator
  151. c_iter::__construct
  152. c_iter::valid = true
  153. c_iter::current
  154. double:2:0
  155. c_iter::next
  156. c_iter::valid = true
  157. c_iter::current
  158. double:2:1
  159. c_iter::next
  160. c_iter::valid = true
  161. c_iter::current
  162. double:2:2
  163. c_iter::next
  164. c_iter::valid = false
  165. c_iter::next
  166. c_iter::valid = false
  167. ===foreach/key===
  168. c::getIterator
  169. c_iter::__construct
  170. c_iter::valid = true
  171. c_iter::current
  172. c_iter::key
  173. object:1st=>0
  174. c_iter::next
  175. c_iter::valid = true
  176. c_iter::current
  177. c_iter::key
  178. object:2nd=>1
  179. c_iter::next
  180. c_iter::valid = true
  181. c_iter::current
  182. c_iter::key
  183. object:3rd=>2
  184. c_iter::next
  185. c_iter::valid = false
  186. Done