From 184309c2e9615e71bcd7bf2fd20421f6d0414bad Mon Sep 17 00:00:00 2001 From: Marcus Boerger Date: Mon, 3 Oct 2005 09:14:30 +0000 Subject: [PATCH] - MFH Fix issue with RecursiveArrayIterator::getChildren() --- ext/spl/examples/class_tree.php | 5 ----- ext/spl/internal/recursivearrayiterator.inc | 6 +++++- ext/spl/spl_array.c | 4 ++++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ext/spl/examples/class_tree.php b/ext/spl/examples/class_tree.php index 128eebec58c..07741a7dd87 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 1b4497afd80..e583c734b41 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 e62b2ad10fd..f1cb7ab6503 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); }