Annotation of embedaddon/php/ext/spl/internal/recursivecachingiterator.inc, revision 1.1.1.1

1.1       misho       1: <?php
                      2: 
                      3: /** @file recursivecachingiterator.inc
                      4:  * @ingroup SPL
                      5:  * @brief class RecursiveCachingIterator
                      6:  * @author  Marcus Boerger
                      7:  * @date    2003 - 2009
                      8:  *
                      9:  * SPL - Standard PHP Library
                     10:  */
                     11: 
                     12: /**
                     13:  * @brief   Cached recursive iteration over another Iterator
                     14:  * @author  Marcus Boerger
                     15:  * @version 1.2
                     16:  * @since PHP 5.1
                     17:  *
                     18:  * @see CachingIterator
                     19:  */
                     20: class RecursiveCachingIterator extends CachingIterator implements RecursiveIterator
                     21: {
                     22:        private $hasChildren;
                     23:        private $getChildren;
                     24: 
                     25:        /** Construct from another iterator
                     26:         *
                     27:         * @param it    Iterator to cache
                     28:         * @param flags Bitmask: 
                     29:         *              - CALL_TOSTRING   (whether to call __toString() for every element)
                     30:         *              - CATCH_GET_CHILD (whether to catch exceptions when trying to get childs)
                     31:         */
                     32:        function __construct(RecursiveIterator $it, $flags = self::CALL_TOSTRING)
                     33:        {
                     34:                parent::__construct($it, $flags);
                     35:        }
                     36: 
                     37:        /** Rewind Iterator
                     38:         */     
                     39:        function rewind();
                     40:        {
                     41:           $this->hasChildren = false;
                     42:           $this->getChildren = NULL;
                     43:           parent::rewind();
                     44:        }
                     45: 
                     46:        /** Forward to next element if necessary then an Iterator for the Children
                     47:         * will be created.
                     48:         */
                     49:        function next()
                     50:        {
                     51:                if ($this->hasChildren = $this->it->hasChildren())
                     52:                {
                     53:                        try
                     54:                        {
                     55:                                $child = $this->it->getChildren();
                     56:                                if (!$this->ref)
                     57:                                {
                     58:                                        $this->ref = new ReflectionClass($this);
                     59:                                }
                     60:                                $this->getChildren = $ref->newInstance($child, $this->flags);
                     61:                        }
                     62:                        catch(Exception $e)
                     63:                        {
                     64:                                if (!$this->flags & self::CATCH_GET_CHILD)
                     65:                                {
                     66:                                        throw $e;
                     67:                                }
                     68:                                $this->hasChildren = false;
                     69:                                $this->getChildren = NULL;
                     70:                        }
                     71:                } else
                     72:                {
                     73:                        $this->getChildren = NULL;
                     74:                }
                     75:                parent::next();
                     76:        }
                     77:        
                     78:        private $ref;
                     79: 
                     80:        /** @return whether the current element has children
                     81:         * @note The check whether the Iterator for the children can be created was
                     82:         *       already executed. Hence when flag CATCH_GET_CHILD was given in
                     83:         *       constructor this fucntion returns false so that getChildren does 
                     84:         *       not try to access those children.
                     85:         */
                     86:        function hasChildren()
                     87:        {
                     88:                return $this->hasChildren;
                     89:        }
                     90: 
                     91:        /** @return An Iterator for the children
                     92:         */
                     93:        function getChildren()
                     94:        {
                     95:                return $this->getChildren;
                     96:        }
                     97: }
                     98: 
                     99: ?>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>