- Fixed bug #49851 (http wrapper breaks on 1024 char long headers). (Ilia)
- Fixed bug #49600 (imageTTFText text shifted right). (Takeshi Abe)
- Fixed bug #49463 (setAttributeNS fails setting default namespace). (Rob)
+- Fixed bug #48667 (Implementing Iterator and IteratorAggregate). (Etienne)
- Fixed bug #48590 (SoapClient does not honor max_redirects). (Sriram)
- Fixed bug #48190 (Content-type parameter "boundary" is not case-insensitive
in HTTP uploads). (Ilia)
--- /dev/null
+--TEST--
+Bug #48667 (Implementing both iterator and iteratoraggregate)
+--FILE--
+<?php
+
+abstract class A implements Iterator, IteratorAggregate { }
+
+?>
+--EXPECTF--
+Fatal error: Class A cannot implement both IteratorAggregate and Iterator at the same time. in %s on line %d
--- /dev/null
+--TEST--
+Bug #48667 (Implementing both iterator and iteratoraggregate)
+--FILE--
+<?php
+
+abstract class A implements IteratorAggregate, Iterator { }
+
+?>
+--EXPECTF--
+Fatal error: Class A cannot implement both Iterator and IteratorAggregate at the same time. in %s on line %d
if (class_type->num_interfaces) {
for (i = 0; i < class_type->num_interfaces; i++) {
if (class_type->interfaces[i] == zend_ce_iterator) {
+ zend_error(E_ERROR, "Class %s cannot implement both %s and %s at the same time.",
+ class_type->name,
+ interface->name,
+ zend_ce_iterator->name);
return FAILURE;
}
if (class_type->interfaces[i] == zend_ce_traversable) {
if (class_type->type == ZEND_INTERNAL_CLASS) {
/* inheritance ensures the class has the necessary userland methods */
return SUCCESS;
- } else if (class_type->get_iterator != zend_user_it_get_new_iterator) {
+ } else {
/* c-level get_iterator cannot be changed */
+ if (class_type->get_iterator == zend_user_it_get_new_iterator) {
+ zend_error(E_ERROR, "Class %s cannot implement both %s and %s at the same time.",
+ class_type->name,
+ interface->name,
+ zend_ce_aggregate->name);
+ }
return FAILURE;
}
}