Annotation of embedaddon/php/ext/spl/internal/iteratoriterator.inc, revision 1.1
1.1 ! misho 1: <?php
! 2:
! 3: /** @file iteratoriterator.inc
! 4: * @ingroup SPL
! 5: * @brief class IteratorIterator
! 6: * @author Marcus Boerger
! 7: * @date 2003 - 2009
! 8: *
! 9: * SPL - Standard PHP Library
! 10: */
! 11:
! 12: /** @ingroup SPL
! 13: * @brief Basic Iterator wrapper
! 14: * @since PHP 5.1
! 15: *
! 16: * This iterator wrapper allows to convert anything that is traversable into
! 17: * an Iterator. It is very important to understand that most classes that do
! 18: * not implement Iterator have their reasone to. Most likely they do not allow
! 19: * the full Iterator feature set. If so you need to provide techniques to
! 20: * prevent missuse. If you do not you must expect exceptions or fatal erros.
! 21: *
! 22: * It is also possible to derive the class and implement IteratorAggregate by
! 23: * downcasting the instances returned in getIterator. See the following
! 24: * example (assuming BaseClass implements Traversable):
! 25: \code
! 26: class SomeClass extends BaseClass implements IteratorAggregate
! 27: {
! 28: function getIterator()
! 29: {
! 30: return new IteratorIterator($this, 'BaseClass');
! 31: }
! 32: }
! 33: \endcode
! 34: *
! 35: * As you can see in the example this approach requires that the class to
! 36: * downcast to is actually a base class of the specified iterator to wrap.
! 37: * Omitting the downcast in the above example would result in an endless loop
! 38: * since IteratorIterator::__construct() would call SomeClass::getIterator().
! 39: */
! 40: class IteratorIterator implements OuterIterator
! 41: {
! 42: /** Construct an IteratorIterator from an Iterator or an IteratorAggregate.
! 43: *
! 44: * @param iterator inner iterator
! 45: * @param classname optional class the iterator has to be downcasted to
! 46: */
! 47: function __construct(Traversable $iterator, $classname = null)
! 48: {
! 49: if ($iterator instanceof IteratorAggregate)
! 50: {
! 51: $iterator = $iterator->getIterator();
! 52: }
! 53: if ($iterator instanceof Iterator)
! 54: {
! 55: $this->iterator = $iterator;
! 56: }
! 57: else
! 58: {
! 59: throw new Exception("Classes that only implement Traversable can be wrapped only after converting class IteratorIterator into c code");
! 60: }
! 61: }
! 62:
! 63: /** \return the inner iterator as passed to the constructor
! 64: */
! 65: function getInnerIterator()
! 66: {
! 67: return $this->iterator;
! 68: }
! 69:
! 70: /** \return whether the iterator is valid
! 71: */
! 72: function valid()
! 73: {
! 74: return $this->iterator->valid();
! 75: }
! 76:
! 77: /** \return current key
! 78: */
! 79: function key()
! 80: {
! 81: return $this->iterator->key();
! 82: }
! 83:
! 84: /** \return current value
! 85: */
! 86: function current()
! 87: {
! 88: return $this->iterator->current();
! 89: }
! 90:
! 91: /** forward to next element
! 92: */
! 93: function next()
! 94: {
! 95: return $this->iterator->next();
! 96: }
! 97:
! 98: /** rewind to the first element
! 99: */
! 100: function rewind()
! 101: {
! 102: return $this->iterator->rewind();
! 103: }
! 104:
! 105: /** Aggregate the inner iterator
! 106: *
! 107: * @param func Name of method to invoke
! 108: * @param params Array of parameters to pass to method
! 109: */
! 110: function __call($func, $params)
! 111: {
! 112: return call_user_func_array(array($this->iterator, $func), $params);
! 113: }
! 114:
! 115: /** The inner iterator must be private because when this class will be
! 116: * converted to c code it won't no longer be available.
! 117: */
! 118: private $iterator;
! 119: }
! 120:
! 121: ?>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>