1--TEST-- 2SPL: iterator_to_array() and exceptions from delayed destruct 3--FILE-- 4<?php 5 6class MyArrayIterator extends ArrayIterator 7{ 8 static protected $fail = 0; 9 public $state; 10 11 static function fail($state, $method) 12 { 13 if (self::$fail == $state) 14 { 15 throw new Exception("State $state: $method()"); 16 } 17 } 18 19 function __construct() 20 { 21 $this->state = MyArrayIterator::$fail; 22 self::fail(0, __FUNCTION__); 23 parent::__construct(array(1, 2)); 24 self::fail(1, __FUNCTION__); 25 } 26 27 function rewind() 28 { 29 self::fail(2, __FUNCTION__); 30 return parent::rewind(); 31 } 32 33 function valid() 34 { 35 self::fail(3, __FUNCTION__); 36 return parent::valid(); 37 } 38 39 function current() 40 { 41 self::fail(4, __FUNCTION__); 42 return parent::current(); 43 } 44 45 function key() 46 { 47 self::fail(5, __FUNCTION__); 48 return parent::key(); 49 } 50 51 function next() 52 { 53 self::fail(6, __FUNCTION__); 54 return parent::next(); 55 } 56 57 function __destruct() 58 { 59 self::fail(7, __FUNCTION__); 60 } 61 62 static function test($func, $skip = null) 63 { 64 echo "===$func===\n"; 65 self::$fail = 0; 66 while(self::$fail < 10) 67 { 68 try 69 { 70 var_dump($func(new MyArrayIterator())); 71 break; 72 } 73 catch (Exception $e) 74 { 75 echo $e->getMessage() . "\n"; 76 } 77 if (isset($skip[self::$fail])) 78 { 79 self::$fail = $skip[self::$fail]; 80 } 81 else 82 { 83 self::$fail++; 84 } 85 } 86 } 87} 88 89MyArrayIterator::test('iterator_to_array'); 90MyArrayIterator::test('iterator_count', array(3 => 6)); 91 92?> 93===DONE=== 94<?php exit(0); ?> 95--EXPECTF-- 96===iterator_to_array=== 97State 0: __construct() 98State 1: __construct() 99State 2: rewind() 100State 3: valid() 101State 4: current() 102State 5: key() 103State 6: next() 104===iterator_count=== 105State 0: __construct() 106State 1: __construct() 107State 2: rewind() 108State 3: valid() 109State 6: next() 110===DONE=== 111