summaryrefslogtreecommitdiff
path: root/Zend/zend_inheritance.c
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 /Zend/zend_inheritance.c
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.
Diffstat (limited to 'Zend/zend_inheritance.c')
-rw-r--r--Zend/zend_inheritance.c24
1 files changed, 18 insertions, 6 deletions
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;