iterator_001.phpt 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. --TEST--
  2. SPL: Iterator aggregating inner iterator's methods
  3. --FILE--
  4. <?php
  5. class NumericArrayIterator implements Iterator
  6. {
  7. protected $a;
  8. protected $i = 0;
  9. public function __construct($a)
  10. {
  11. echo __METHOD__ . "\n";
  12. $this->a = $a;
  13. }
  14. public function rewind(): void
  15. {
  16. echo __METHOD__ . "\n";
  17. $this->i = 0;
  18. }
  19. public function valid(): bool
  20. {
  21. $ret = $this->i < count($this->a);
  22. echo __METHOD__ . '(' . ($ret ? 'true' : 'false') . ")\n";
  23. return $ret;
  24. }
  25. public function key(): mixed
  26. {
  27. echo __METHOD__ . "\n";
  28. return $this->i;
  29. }
  30. public function current(): mixed
  31. {
  32. echo __METHOD__ . "\n";
  33. return $this->a[$this->i];
  34. }
  35. public function next(): void
  36. {
  37. echo __METHOD__ . "\n";
  38. $this->i++;
  39. }
  40. public function greaterThan($comp)
  41. {
  42. echo get_class($this) . '::' . __FUNCTION__ . '(' . $comp . ")\n";
  43. return $this->current() > $comp;
  44. }
  45. }
  46. class SeekableNumericArrayIterator extends NumericArrayIterator implements SeekableIterator
  47. {
  48. public function seek($index): void
  49. {
  50. if ($index < count($this->a)) {
  51. $this->i = $index;
  52. }
  53. echo __METHOD__ . '(' . $index . ")\n";
  54. }
  55. }
  56. $a = array(1, 2, 3, 4, 5);
  57. $it = new LimitIterator(new NumericArrayIterator($a), 1, 3);
  58. foreach ($it as $v)
  59. {
  60. print $v . ' is ' . ($it->greaterThan(2) ? 'greater than 2' : 'less than or equal 2') . "\n";
  61. }
  62. echo "===SEEKABLE===\n";
  63. $a = array(1, 2, 3, 4, 5);
  64. $it = new LimitIterator(new SeekableNumericArrayIterator($a), 1, 3);
  65. foreach($it as $v)
  66. {
  67. print $v . ' is ' . ($it->greaterThan(2) ? 'greater than 2' : 'less than or equal 2') . "\n";
  68. }
  69. echo "===STACKED===\n";
  70. echo "Shows '2 is greater than 2' because the test is actually done with the current value which is 3.\n";
  71. $a = array(1, 2, 3, 4, 5);
  72. $it = new CachingIterator(new LimitIterator(new SeekableNumericArrayIterator($a), 1, 3));
  73. foreach($it as $v)
  74. {
  75. print $v . ' is ' . ($it->greaterThan(2) ? 'greater than 2' : 'less than or equal 2') . "\n";
  76. }
  77. ?>
  78. --EXPECT--
  79. NumericArrayIterator::__construct
  80. NumericArrayIterator::rewind
  81. NumericArrayIterator::valid(true)
  82. NumericArrayIterator::next
  83. NumericArrayIterator::valid(true)
  84. NumericArrayIterator::valid(true)
  85. NumericArrayIterator::current
  86. NumericArrayIterator::key
  87. NumericArrayIterator::greaterThan(2)
  88. NumericArrayIterator::current
  89. 2 is less than or equal 2
  90. NumericArrayIterator::next
  91. NumericArrayIterator::valid(true)
  92. NumericArrayIterator::current
  93. NumericArrayIterator::key
  94. NumericArrayIterator::greaterThan(2)
  95. NumericArrayIterator::current
  96. 3 is greater than 2
  97. NumericArrayIterator::next
  98. NumericArrayIterator::valid(true)
  99. NumericArrayIterator::current
  100. NumericArrayIterator::key
  101. NumericArrayIterator::greaterThan(2)
  102. NumericArrayIterator::current
  103. 4 is greater than 2
  104. NumericArrayIterator::next
  105. ===SEEKABLE===
  106. NumericArrayIterator::__construct
  107. NumericArrayIterator::rewind
  108. SeekableNumericArrayIterator::seek(1)
  109. NumericArrayIterator::valid(true)
  110. NumericArrayIterator::current
  111. NumericArrayIterator::key
  112. SeekableNumericArrayIterator::greaterThan(2)
  113. NumericArrayIterator::current
  114. 2 is less than or equal 2
  115. NumericArrayIterator::next
  116. NumericArrayIterator::valid(true)
  117. NumericArrayIterator::current
  118. NumericArrayIterator::key
  119. SeekableNumericArrayIterator::greaterThan(2)
  120. NumericArrayIterator::current
  121. 3 is greater than 2
  122. NumericArrayIterator::next
  123. NumericArrayIterator::valid(true)
  124. NumericArrayIterator::current
  125. NumericArrayIterator::key
  126. SeekableNumericArrayIterator::greaterThan(2)
  127. NumericArrayIterator::current
  128. 4 is greater than 2
  129. NumericArrayIterator::next
  130. ===STACKED===
  131. Shows '2 is greater than 2' because the test is actually done with the current value which is 3.
  132. NumericArrayIterator::__construct
  133. NumericArrayIterator::rewind
  134. SeekableNumericArrayIterator::seek(1)
  135. NumericArrayIterator::valid(true)
  136. NumericArrayIterator::current
  137. NumericArrayIterator::key
  138. NumericArrayIterator::next
  139. NumericArrayIterator::valid(true)
  140. NumericArrayIterator::current
  141. NumericArrayIterator::key
  142. SeekableNumericArrayIterator::greaterThan(2)
  143. NumericArrayIterator::current
  144. 2 is greater than 2
  145. NumericArrayIterator::next
  146. NumericArrayIterator::valid(true)
  147. NumericArrayIterator::current
  148. NumericArrayIterator::key
  149. SeekableNumericArrayIterator::greaterThan(2)
  150. NumericArrayIterator::current
  151. 3 is greater than 2
  152. NumericArrayIterator::next
  153. SeekableNumericArrayIterator::greaterThan(2)
  154. NumericArrayIterator::current
  155. 4 is greater than 2