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