1--TEST-- 2SPL: iterator_to_array() and exceptions from 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(): void 28 { 29 self::fail(2, __FUNCTION__); 30 parent::rewind(); 31 } 32 33 function valid(): bool 34 { 35 self::fail(3, __FUNCTION__); 36 return parent::valid(); 37 } 38 39 function current(): mixed 40 { 41 self::fail(4, __FUNCTION__); 42 return parent::current(); 43 } 44 45 function key(): string|int|null 46 { 47 self::fail(5, __FUNCTION__); 48 return parent::key(); 49 } 50 51 function next(): void 52 { 53 self::fail(6, __FUNCTION__); 54 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 = 7; 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--EXPECT-- 94===iterator_to_array=== 95State 7: __destruct() 96array(2) { 97 [0]=> 98 int(1) 99 [1]=> 100 int(2) 101} 102===iterator_count=== 103State 7: __destruct() 104int(2) 105