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