diff options
author | Guilherme Blanco <guilhermeblanco@hotmail.com> | 2014-12-06 04:42:52 +0000 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-02-13 15:31:48 +0100 |
commit | 4498d34aeaadcbc2ab64b9c0f40f336bf363b2d6 (patch) | |
tree | 6fe2967b3dd068b73bf9773e41e2fdb477664590 /Zend/zend_inheritance.c | |
parent | c17e007a293356a5b1e511626addb9f13d4eaaee (diff) | |
download | php-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.c | 24 |
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; |