helly           Fri Oct  8 17:49:40 2004 EDT

  Added files:                 
    /php-src/ext/spl/examples   nocvsdir.php 

  Modified files:              
    /php-src/ext/spl/examples   recursivefilteriterator.inc 
  Log:
  - Make RecursiveFilterIterator work by using reflection
  - Add docu
  - Add new example
  
  
http://cvs.php.net/diff.php/php-src/ext/spl/examples/recursivefilteriterator.inc?r1=1.1&r2=1.2&ty=u
Index: php-src/ext/spl/examples/recursivefilteriterator.inc
diff -u php-src/ext/spl/examples/recursivefilteriterator.inc:1.1 
php-src/ext/spl/examples/recursivefilteriterator.inc:1.2
--- php-src/ext/spl/examples/recursivefilteriterator.inc:1.1    Fri Oct  8 17:17:53 
2004
+++ php-src/ext/spl/examples/recursivefilteriterator.inc        Fri Oct  8 17:49:39 
2004
@@ -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
  *
@@ -14,23 +14,45 @@
  * @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

http://cvs.php.net/co.php/php-src/ext/spl/examples/nocvsdir.php?r=1.1&p=1
Index: php-src/ext/spl/examples/nocvsdir.php
+++ php-src/ext/spl/examples/nocvsdir.php
<?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";
}

?>

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to