summaryrefslogtreecommitdiff
path: root/Zend/zend_interfaces.c
diff options
context:
space:
mode:
authorEtienne Kneuss <colder@php.net>2010-02-01 13:45:57 +0000
committerEtienne Kneuss <colder@php.net>2010-02-01 13:45:57 +0000
commitcca05f1403dca5db3f090850d8623cb7f36cd188 (patch)
treee242dec6f7420be5e48bc7b0585470a010c5b20d /Zend/zend_interfaces.c
parentb0f76c253485334d1d917b45b867bce02f26ccd9 (diff)
downloadphp-git-cca05f1403dca5db3f090850d8623cb7f36cd188.tar.gz
Fix #48667 (Implementing Iterator and IteratorAggregate is now restricted in both orders)
Diffstat (limited to 'Zend/zend_interfaces.c')
-rwxr-xr-xZend/zend_interfaces.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index 4106c7e2da..5f9440fb90 100755
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -353,6 +353,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 %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) {
@@ -378,8 +382,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 %s cannot implement both %s and %s at the same time.",
+ class_type->name,
+ interface->name,
+ zend_ce_aggregate->name);
+ }
return FAILURE;
}
}