Edit report at http://bugs.php.net/bug.php?id=38618&edit=1
ID: 38618
Comment by: mi dot olszewski at gmail dot com
Reported by: mike at silverorange dot com
Summary: default implementation of hasChildren() in
RecursiveArrayIterator does not work
Status: No Feedback
Type: Bug
Package: SPL related
Operating System: *
PHP Version: 5.2.5
Assigned To: colder
New Comment:
Hi,
I've stumbled upon this issue and although fix
(RecursiveArrayIterator::CHILD_ARRAYS_ONLY flag/constant) is available
on PHP 5.3 it is not present in PHP 5.2.
Additionally PHP sources are out of sync - the new constant is present
only in spl_array.c file but recursivearrayiterator.inc is not updated:
the CHILD_ARRAYS_ONLY constant is missing and hasChildren() definition
contains only is_array() check. This is really confusing because new
users of RecursiveArrayIterator will check PHP sources first. It took me
quite a while to find out about this new flag. Also - most of hosting
providers still use PHP 5.2 which means most of people will have to use
hasChildren() override workaround to get it working.
Could you please add the constant to PHP 5.2 branch and update
recursivearrayiterator.inc (and documentation at
http://www.php.net/~helly/php/ext/spl if possible)?
Thank you.
Previous Comments:
------------------------------------------------------------------------
[2008-05-15 23:23:28] [email protected]
I MFB'ed that patch to HEAD as well with a slight distinction,
The constant now belongs to RecursiveArrayIterator, and not ArrayObject
anymore.
This flag is off by default.
------------------------------------------------------------------------
[2007-12-05 16:00:40] [email protected]
So far the behavior is expected as ArrayObject/ArrayIterator follow
arrays as well as objects. For 5.3 I added a new flag
ArrayObject::CHILD_ARRAYS_ONLY that can be used to prevent ArrayIterator
from following objects. IF you feel this is ok let me know. If you think
the behavior should be reverse, meaning the flag should be active by
default and there should be a way to disable it then open a RFC on
[email protected].
------------------------------------------------------------------------
[2007-08-20 15:01:23] [email protected]
Marcus, can you check this out please?
------------------------------------------------------------------------
[2007-08-20 14:14:53] mike at silverorange dot com
I played around with the test case a bit more and it seems that the
default RecursiveArrayIterator iterates the public properties of objects
within the arrays.
For example, if I adda public $foo = 'bar' property to the Fruit class,
I get the following (incorrect) output:
Default recursive array iteraration:
title => apple
foo => bar
title => orange
foo => bar
title => banana
foo => bar
title => grape
foo => bar
title => peach
foo => bar
title => strawberry
foo => bar
title => grapefruit
foo => bar
------------------------------------------------------------------------
[2007-08-20 14:05:21] mike at silverorange dot com
I tried changing the scope of the $title property from protected to
public and the test case does indeed run correctly.
Even so, the test case should still run correctly when the property is
protected.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/bug.php?id=38618
--
Edit this bug report at http://bugs.php.net/bug.php?id=38618&edit=1