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 try { 86 $e = null; 87 } catch (Exception $e) { 88 } 89 } 90 } 91} 92 93MyArrayIterator::test('iterator_to_array'); 94MyArrayIterator::test('iterator_count', array(3 => 6)); 95 96?> 97===DONE=== 98<?php exit(0); ?> 99--EXPECT-- 100===iterator_to_array=== 101State 0: __construct() 102State 1: __construct() 103State 2: rewind() 104State 3: valid() 105State 4: current() 106State 5: key() 107State 6: next() 108State 7: __destruct() 109array(2) { 110 [0]=> 111 int(1) 112 [1]=> 113 int(2) 114} 115===iterator_count=== 116State 0: __construct() 117State 1: __construct() 118State 2: rewind() 119State 3: valid() 120State 6: next() 121State 7: __destruct() 122int(2) 123===DONE=== 124