From: Sara Golemon Date: Wed, 31 May 2017 21:18:19 +0000 (-0700) Subject: Allow ReflectionClass::isIterable() to return true for Traversables X-Git-Tag: php-7.2.0alpha1~27 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d1cfd87fbe9e34bf909abedb61cfa4b2d7022b4d;p=php Allow ReflectionClass::isIterable() to return true for Traversables Current behavior is essentially "Is an INTERNAL iterable class". This change allows isIterable() to return true for userspace classes as well. --- diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 84f4d66aeb..19975d29bc 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5131,7 +5131,12 @@ ZEND_METHOD(reflection_class, isIterable) METHOD_NOTSTATIC(reflection_class_ptr); GET_REFLECTION_OBJECT_PTR(ce); - RETURN_BOOL(ce->get_iterator != NULL); + if (ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_IMPLICIT_ABSTRACT_CLASS | + ZEND_ACC_TRAIT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { + RETURN_FALSE; + } + + RETURN_BOOL(ce->get_iterator || instanceof_function(ce, zend_ce_traversable)); } /* }}} */