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