summaryrefslogtreecommitdiff
path: root/Zend/zend_interfaces.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-03-06 11:08:59 +0100
committerNikita Popov <nikita.ppv@gmail.com>2020-03-06 11:12:43 +0100
commite9ae581f024e06878b2b1991b7daed6318c811a7 (patch)
tree0d112ad0a2c833b4895baa9ac208635a976927e2 /Zend/zend_interfaces.c
parent125724cf58ef0a03d12612e6e4a8ae9204454cca (diff)
downloadphp-git-e9ae581f024e06878b2b1991b7daed6318c811a7.tar.gz
Fixed bug #62609: Allow implementing Traversable in abstract class
Master only, as this depends on fixes to calling order of interface implementation handlers.
Diffstat (limited to 'Zend/zend_interfaces.c')
-rw-r--r--Zend/zend_interfaces.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index cf8b24d76a..acebe0a1fb 100644
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -293,6 +293,11 @@ static int zend_implement_traversable(zend_class_entry *interface, zend_class_en
if (class_type->get_iterator || (class_type->parent && class_type->parent->get_iterator)) {
return SUCCESS;
}
+ /* Abstract class can implement Traversable only, in which case the extending class must
+ * implement Iterator or IteratorAggregate. */
+ if (class_type->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) {
+ return SUCCESS;
+ }
if (class_type->num_interfaces) {
ZEND_ASSERT(class_type->ce_flags & ZEND_ACC_RESOLVED_INTERFACES);
for (i = 0; i < class_type->num_interfaces; i++) {