]> granicus.if.org Git - php/commitdiff
- Make RecursiveFilterIterator work by using reflection
authorMarcus Boerger <helly@php.net>
Fri, 8 Oct 2004 21:49:39 +0000 (21:49 +0000)
committerMarcus Boerger <helly@php.net>
Fri, 8 Oct 2004 21:49:39 +0000 (21:49 +0000)
- Add docu
- Add new example

ext/spl/examples/nocvsdir.php [new file with mode: 0755]
ext/spl/examples/recursivefilteriterator.inc

diff --git a/ext/spl/examples/nocvsdir.php b/ext/spl/examples/nocvsdir.php
new file mode 100755 (executable)
index 0000000..fc0cab3
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+
+/** @file   nocvsdir.php
+ * @brief   Program Dir without CVS subdirs
+ * @ingroup Examples
+ * @author  Marcus Boerger
+ * @date    2003 - 2004
+ *
+ * Usage: php nocvsdir.php \<path\>
+ *
+ * Simply specify the path to tree with parameter \<path\>.
+ */
+
+if ($argc < 2) {
+       echo <<<EOF
+Usage: php ${_SERVER['PHP_SELF']} <path>
+
+Show the directory and all it's contents without any CVS directory in <path>.
+
+<path> The directory for which to generate the directory.
+
+
+EOF;
+       exit(1);
+}
+
+if (!class_exists("RecursiveFilterIterator")) require_once("recursivefilteriterator.inc");
+
+class NoCvsDirectory extends RecursiveFilterIterator
+{
+       function accept()
+       {
+               return $this->getInnerIterator()->getFilename() != 'CVS';
+       }
+}
+
+$it = new RecursiveIteratorIterator(new NoCvsDirectory(new RecursiveDirectoryIterator($argv[1])));
+
+foreach($it as $pathname => $file)
+{
+       echo $pathname."\n";
+}
+
+?>
\ No newline at end of file
index f97afb06d810064a8fccbd867f98894f66004afe..0c1c901fb33bb1de4f77e2c229723e29bb55c63d 100755 (executable)
@@ -1,8 +1,8 @@
 <?php
 
-/** @file norewinditerator.inc
+/** @file recursivefilteriterator.inc
  * @ingroup Examples
- * @brief class NoRewindIterator
+ * @brief class RecursiveFilterIterator
  * @author  Marcus Boerger
  * @date    2003 - 2004
  *
  * @author  Marcus Boerger
  * @version 1.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.
  */
 abstract class RecursiveFilterIterator extends FilterIterator implements RecursiveIterator
 {
+       /*! The constructor takes a RecursiveIterator
+        */
        function __construct(RecursiveIterator $it)
        {
+               $this->ref = new ReflectionClass($this);
                parent::__construct($it);
        }
-       
+
+       /*! return whether the inner iterator has children
+        */
        function hasChildren()
        {
                return $this->getInnerIterator()->hasChildren();
        }
 
+       /*! \return children as instance of derived RecursiveFilterIterator class
+        *
+        *  \see RecursiveFilterIterator
+        */
        function getChildren()
        {
-               return $this->getInnerIterator()->getChildren();
+               return $this->ref->newInstance($this->getInnerIterator()->getChildren());
        }
+       
+       private $ref;
 }
 
 ?>
\ No newline at end of file