RecursiveFilterItrator possible issues with inheritance

From: Date: Wed, 06 May 2009 15:16:19 +0000
Subject: RecursiveFilterItrator possible issues with inheritance
Groups: php.internals 
Request: Send a blank email to internals+get-43862@lists.php.net to get a copy of this message
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

« previous php.internals (#43862) next »