ID: 49723 User updated by: goetas at lignano dot it Reported By: goetas at lignano dot it Status: Assigned Bug Type: SPL related Operating System: * PHP Version: 5.3.0 Assigned To: colder New Comment:
i think this can be a bug... or not correcty explained feature, becasue following code works fine: $it = new EmptyIterator(); // EmptyIterator instead of ArrayIterator $limIt = new LimitIterator($it, 0, 5); foreach ($limIt as $item){ echo $item; } both range are empty, but EmptyIterator does not implements SeekableIterator while ArrayIterator it does. exception is thrown only if iterator implements SeekableIterator and is empty. Previous Comments: ------------------------------------------------------------------------ [2009-10-05 23:47:08] ka...@php.net The implementation you are looking at (defined in the php files) is an outdated illustration to show how the iterator is implemented, check out: spl_limit_it_seek() inside php-src/ext/spl/spl_iterators.c for the actual implementation. As for whether this is a bug or not, sounds expected behaviour to me that when trying to loop over an empty range it would cause an OutOfRangeException, rather check the iterator size before trying to loop. ------------------------------------------------------------------------ [2009-10-02 18:29:05] goetas at lignano dot it source code of LimitIterator, "seek" method at line 63: if ($this->it instanceof SeekableIterator) { $this->it->seek($position); <-- there is no check if i can move pointer to $position like on else branch $this->pos = $position; } else { while($this->pos < $position && $this->it->valid()) { <-- valid() ensures that i can move to $position $this->next(); } } ------------------------------------------------------------------------ [2009-10-02 18:23:57] goetas at lignano dot it the problem is not resolved with php 5.3.2-dev on my apache2/winxp ------------------------------------------------------------------------ [2009-10-01 16:09:43] j...@php.net Please try using this snapshot: http://snaps.php.net/php5.3-latest.tar.gz For Windows: http://windows.php.net/snapshots/ ------------------------------------------------------------------------ [2009-09-30 13:48:01] goetas at lignano dot it Description: ------------ iterating over an empty seekable iterator causes an unexpected exception. with actual implementation of LimitIterator::rewind() there is no way to do an empty loop over an empty ArrayIterator. i suggest this implementation for LimitIterator::rewind() method function rewind(){ $this->it->rewind(); $this->pos = 0; if($this->it->valid()){ // check for empty iterators $this->seek($this->offset); } } Reproduce code: --------------- $it = new ArrayIterator(array()); $limIt = new LimitIterator($it, 0, 5); foreach ($limIt as $item){ echo $item; } Expected result: ---------------- an empty loop Actual result: -------------- Uncaught exception 'OutOfBoundsException' with message 'Seek position 0 is out of range' ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=49723&edit=1