summaryrefslogtreecommitdiff
path: root/ext/spl/examples
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2005-09-15 03:38:03 +0000
committerMarcus Boerger <helly@php.net>2005-09-15 03:38:03 +0000
commita29501195f4d0fff6023ed53fc19bfb90d7a0151 (patch)
treedd36643d00206a3bd2fb227f035c18075d87171c /ext/spl/examples
parentb4dd030782ae49646cdefa8435e6c8acbbf17745 (diff)
downloadphp-git-a29501195f4d0fff6023ed53fc19bfb90d7a0151.tar.gz
- MFH: Add new files
Diffstat (limited to 'ext/spl/examples')
-rwxr-xr-xext/spl/examples/recursivearrayiterator.inc55
1 files changed, 55 insertions, 0 deletions
diff --git a/ext/spl/examples/recursivearrayiterator.inc b/ext/spl/examples/recursivearrayiterator.inc
new file mode 100755
index 0000000000..305e54cad9
--- /dev/null
+++ b/ext/spl/examples/recursivearrayiterator.inc
@@ -0,0 +1,55 @@
+<?php
+
+/** @file recursivearrayiterator.inc
+ * @ingroup Examples
+ * @brief class RecursiveArrayIterator
+ * @author Marcus Boerger
+ * @date 2003 - 2005
+ *
+ * SPL - Standard PHP Library
+ */
+
+/** @ingroup Examples
+ * @brief A recursive array iterator
+ * @author Marcus Boerger
+ * @version 1.0
+ * @since PHP 6.0
+ *
+ * Passes the RecursiveIterator interface to the inner Iterator and provides
+ * the same functionality as FilterIterator. This allows you to skip parents
+ * and all their childs before loading them all. You need to care about
+ * function getChildren() because it may not always suit your needs. The
+ * builtin behavior uses reflection to return a new instance of the exact same
+ * class it is called from. That is you extend RecursiveFilterIterator and
+ * getChildren() will create instance of that class. The problem is that doing
+ * this does not transport any state or control information of your accept()
+ * implementation to the new instance. To overcome this problem you might
+ * need to overwrite getChildren(), call this implementation and pass the
+ * control vaules manually.
+ */
+class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator
+{
+ /** @return whether the current element has children
+ */
+ function hasChildren()
+ {
+ return is_array($this->current());
+ }
+
+ /** @return an iterator for the current elements children
+ *
+ * @note the returned iterator will be of the same class as $this
+ */
+ function getChildren()
+ {
+ if (empty($this->ref))
+ {
+ $this->ref = new ReflectionClass($this);
+ }
+ return $this->ref->newInstance($this->current());
+ }
+
+ private $ref;
+}
+
+?> \ No newline at end of file