Back to index

php5  5.3.10
cachingiterator.inc
Go to the documentation of this file.
00001 <?php
00002 
00028 class CachingIterator implements OuterIterator
00029 {
00030        const CALL_TOSTRING        = 0x00000001;
00031        const CATCH_GET_CHILD      = 0x00000002;
00032        const TOSTRING_USE_KEY     = 0x00000010;
00033        const TOSTRING_USE_CURRENT = 0x00000020;
00034 
00035        private $it;
00036        private $current;
00037        private $key;
00038        private $valid;
00039        private $strValue;
00040 
00047        function __construct(Iterator $it, $flags = self::CALL_TOSTRING)
00048        {
00049               if ((($flags & self::CALL_TOSTRING) && ($flags & (self::TOSTRING_USE_KEY|self::TOSTRING_USE_CURRENT)))
00050               || ((flags & (self::CIT_TOSTRING_USE_KEY|self::CIT_TOSTRING_USE_CURRENT)) == (self::CIT_TOSTRING_USE_KEY|self::CIT_TOSTRING_USE_CURRENT)))
00051               {
00052                      throw new InvalidArgumentException('Flags must contain only one of CIT_CALL_TOSTRING, CIT_TOSTRING_USE_KEY, CIT_TOSTRING_USE_CURRENT');
00053               }
00054               $this->it = $it;
00055               $this->flags = $flags & (0x0000FFFF);
00056               $this->next();
00057        }
00058 
00061        function rewind()
00062        {
00063               $this->it->rewind();
00064               $this->next();
00065        }
00066        
00069        function next()
00070        {
00071               if ($this->valid = $this->it->valid()) {
00072                      $this->current = $this->it->current();
00073                      $this->key = $this->it->key();
00074                      if ($this->flags & self::CALL_TOSTRING) {
00075                             if (is_object($this->current)) {
00076                                    $this->strValue = $this->current->__toString();
00077                             } else {
00078                                    $this->strValue = (string)$this->current;
00079                             }
00080                      }
00081               } else {
00082                      $this->current = NULL;
00083                      $this->key = NULL;
00084                      $this->strValue = NULL;
00085               }
00086               $this->it->next();
00087        }
00088        
00091        function valid()
00092        {
00093               return $this->valid;
00094        }
00095 
00098        function hasNext()
00099        {
00100               return $this->it->valid();
00101        }
00102        
00105        function current()
00106        {
00107               return $this->current;
00108        }
00109 
00112        function key()
00113        {
00114               return $this->key;
00115        }
00116 
00122        function __call($func, $params)
00123        {
00124               return call_user_func_array(array($this->it, $func), $params);
00125        }
00126        
00131        function __toString()
00132        {
00133               if ($this->flags & self::TOSTRING_USE_KEY)
00134               {
00135                      return $this->key;
00136               }
00137               else if ($this->flags & self::TOSTRING_USE_CURRENT)
00138               {
00139                      return $this->current;
00140               }
00141               if (!$this->flags & self::CALL_TOSTRING)
00142               {
00143                      throw new exception('CachingIterator does not fetch string value (see CachingIterator::__construct)');
00144               }
00145               return $this->strValue;
00146        }
00147        
00151        function getInnerIterator()
00152        {
00153               return $this->it;
00154        }
00155 }
00156 
00157 ?>