iterators_001.phpt 3.2 KB

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