iterators_003.phpt 1.8 KB

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