Hi all,

I'd like to confirm something as a bug and/or design issue.

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

Reply via email to