summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2005-10-03 09:14:30 +0000
committerMarcus Boerger <helly@php.net>2005-10-03 09:14:30 +0000
commit184309c2e9615e71bcd7bf2fd20421f6d0414bad (patch)
tree9cc3bf5c5f9d066fba2806b4fdfd39c981f1f76d
parent594fd87ca7f14d527147871d39247f376235254d (diff)
downloadphp-git-184309c2e9615e71bcd7bf2fd20421f6d0414bad.tar.gz
- MFH Fix issue with RecursiveArrayIterator::getChildren()
-rwxr-xr-xext/spl/examples/class_tree.php5
-rwxr-xr-xext/spl/internal/recursivearrayiterator.inc6
-rwxr-xr-xext/spl/spl_array.c4
3 files changed, 9 insertions, 6 deletions
diff --git a/ext/spl/examples/class_tree.php b/ext/spl/examples/class_tree.php
index 128eebec58..07741a7dd8 100755
--- a/ext/spl/examples/class_tree.php
+++ b/ext/spl/examples/class_tree.php
@@ -62,11 +62,6 @@ class SubClasses extends RecursiveArrayIterator
}
}
- function getChildren()
- {
- return parent::current();
- }
-
function current()
{
return parent::key();
diff --git a/ext/spl/internal/recursivearrayiterator.inc b/ext/spl/internal/recursivearrayiterator.inc
index 1b4497afd8..e583c734b4 100755
--- a/ext/spl/internal/recursivearrayiterator.inc
+++ b/ext/spl/internal/recursivearrayiterator.inc
@@ -13,7 +13,7 @@
* @brief A recursive array iterator
* @author Marcus Boerger
* @version 1.0
- * @since PHP 6.0
+ * @since PHP 5.1
*
* Passes the RecursiveIterator interface to the inner Iterator and provides
* the same functionality as FilterIterator. This allows you to skip parents
@@ -42,6 +42,10 @@ class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator
*/
function getChildren()
{
+ if ($this->current() instanceof self)
+ {
+ return $this->current();
+ }
if (empty($this->ref))
{
$this->ref = new ReflectionClass($this);
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index e62b2ad10f..f1cb7ab650 100755
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -1186,6 +1186,10 @@ SPL_METHOD(Array, getChildren)
if (zend_hash_get_current_data_ex(aht, (void **) &entry, &intern->pos) == FAILURE) {
return;
}
+
+ if (Z_TYPE_PP(entry) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(entry), Z_OBJCE_P(getThis()) TSRMLS_CC)) {
+ RETURN_ZVAL(*entry, 0, 0);
+ }
spl_instantiate_arg_ex1(Z_OBJCE_P(getThis()), &return_value, 0, *entry TSRMLS_CC);
}