iterators_002.phpt 1.8 KB

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