summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuilherme Blanco <guilhermeblanco@hotmail.com>2014-12-06 04:42:52 +0000
committerNikita Popov <nikic@php.net>2015-02-13 15:31:48 +0100
commit4498d34aeaadcbc2ab64b9c0f40f336bf363b2d6 (patch)
tree6fe2967b3dd068b73bf9773e41e2fdb477664590
parentc17e007a293356a5b1e511626addb9f13d4eaaee (diff)
downloadphp-git-4498d34aeaadcbc2ab64b9c0f40f336bf363b2d6.tar.gz
Check interface/trait extension for internal classes
Removed possibility to have extensions to declare classes extending interfaces or traits. It was checked in user classes, not extensions or internal.
-rw-r--r--Zend/zend_compile.c6
-rw-r--r--Zend/zend_inheritance.c24
2 files changed, 18 insertions, 12 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index c9b67021f0..d4e71aa114 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -982,12 +982,6 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array
return NULL;
}
- if (parent_ce->ce_flags & ZEND_ACC_INTERFACE) {
- zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ce->name->val, parent_ce->name->val);
- } else if (parent_ce->ce_flags & ZEND_ACC_TRAIT) {
- zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ce->name->val, parent_ce->name->val);
- }
-
zend_do_inheritance(ce, parent_ce);
ce->refcount++;
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index dbd81d8e1d..10633d73a7 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -767,15 +767,27 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent
zend_string *key;
zval *zv;
- if ((ce->ce_flags & ZEND_ACC_INTERFACE)
- && !(parent_ce->ce_flags & ZEND_ACC_INTERFACE)) {
- zend_error_noreturn(E_COMPILE_ERROR, "Interface %s may not inherit from class (%s)", ce->name->val, parent_ce->name->val);
- }
- if (parent_ce->ce_flags & ZEND_ACC_FINAL) {
- zend_error_noreturn(E_COMPILE_ERROR, "Class %s may not inherit from final class (%s)", ce->name->val, parent_ce->name->val);
+ if (ce->ce_flags & ZEND_ACC_INTERFACE) {
+ /* Interface can only inherit other interfaces */
+ if (!(parent_ce->ce_flags & ZEND_ACC_INTERFACE)) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Interface %s may not inherit from class (%s)", ce->name->val, parent_ce->name->val);
+ }
+ } else {
+ /* Class declaration must not extend traits or interfaces */
+ if (parent_ce->ce_flags & ZEND_ACC_INTERFACE) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ce->name->val, parent_ce->name->val);
+ } else if (parent_ce->ce_flags & ZEND_ACC_TRAIT) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ce->name->val, parent_ce->name->val);
+ }
+
+ /* Class must not extend a final class */
+ if (parent_ce->ce_flags & ZEND_ACC_FINAL) {
+ zend_error_noreturn(E_COMPILE_ERROR, "Class %s may not inherit from final class (%s)", ce->name->val, parent_ce->name->val);
+ }
}
ce->parent = parent_ce;
+
/* Copy serialize/unserialize callbacks */
if (!ce->serialize) {
ce->serialize = parent_ce->serialize;