Fix #48667 (Implementing Iterator and IteratorAggregate is now restricted in both orders)

This commit is contained in:
Etienne Kneuss 2010-02-01 13:45:57 +00:00
parent 1b1f5e9064
commit 3c82980666
3 changed files with 31 additions and 1 deletions

View File

@ -0,0 +1,10 @@
--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

View File

@ -0,0 +1,10 @@
--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

View File

@ -361,6 +361,10 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr
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 %v cannot implement both %v and %v at the same time.",
class_type->name,
interface->name,
zend_ce_iterator->name);
return FAILURE;
}
if (class_type->interfaces[i] == zend_ce_traversable) {
@ -386,8 +390,14 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry
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 %v cannot implement both %v and %v at the same time.",
class_type->name,
interface->name,
zend_ce_aggregate->name);
}
return FAILURE;
}
}