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>