Hello,

On Wed, May 6, 2009 at 5:16 PM, Ralph Schindler <ra...@smashlabs.com> wrote:
> Hi all,
>
> I'd like to confirm something as a bug and/or design issue.

This is a bug, could you please report it and assign it to me ?

Thanks,

>
> Currently, its difficult to extend RecursiveFilterIterator() with additional
> __construct() arguments (for configuring its behavior).  The reason its
> difficult is b/c when getChildren() is called, a new instance of the RFI is
> created (only way you'd know this is if you look into the source of RFI).
>
> Ideally, this code would work:
>
>
> $rArray = array('a' => array('ab', 'ac', 'ad' => array('ada', 'adc')), 'b'
> => array('bb', 'bc'));
>
> $ri = new RecursiveArrayIterator($rArray);
> $filter = new MyRFI($ri, 'argument');
> $iterator = new RecursiveIteratorIterator($filter);
>
> foreach ($iterator as $key => $item) {
>    echo $key . ' - ' . $item . PHP_EOL;
> }
>
> class MyRFI extends RecursiveFilterIterator
> {
>    protected $_otherArg = null;
>
>    public function __construct($iterator, $otherArg = null)
>    {
>        $r = new ReflectionClass($this);
>        $this->_otherArg = $otherArg;
>        parent::__construct($iterator);
>    }
>
>    public function accept()
>    {
>        echo ($this->_otherArg) ? 'Arg Present' : 'Arg NOT Present';
>        echo PHP_EOL;
>        return true;
>    }
>
>
> The current output would be:
>
>
> ~/tmp/test-rii-filter$ php test-rii-problem.php
> Arg Present
> Arg NOT Present
> 0 - ab
> Arg NOT Present
> 1 - ac
> Arg NOT Present
> Arg NOT Present
> 0 - ada
> Arg NOT Present
> 1 - adc
> Arg Present
> Arg NOT Present
> 0 - bb
> Arg NOT Present
> 1 - bc
>
>
> The ideal output would be:
>
> Arg Present
> Arg Present
> 0 - ab
> Arg Present
> 1 - ac
> Arg Present
> Arg Present
> 0 - ada
> Arg Present
> 1 - adc
> Arg Present
> Arg Present
> 0 - bb
> Arg Present
> 1 - bc
>
>
>
>
> The only proposed change I could would be to make the getChildren() inside
> of RecursiveFilterIterator use clone & add a method called setIterator()
> instead of Reflection::newInstance($iterator)
>
> Is this possible? Or is extending and overriding getChildren() the best
> strategy here?
>
> Reason I post is b/c it seems like using clone/setIterator() would
> facilitate better inheritance / better polymorphism.  And since the
> implementation is in the extension, the typical developer would generally
> not understand how getChildren() really works under the hood.
>
> Thanks,
> Ralph
>
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>



-- 
Etienne Kneuss
http://www.colder.ch

Men never do evil so completely and cheerfully as
when they do it from a religious conviction.
-- Pascal

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to