From cb6bf19bfaff871c10dbccc5e8149f89d99983d3 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 26 Jun 2010 22:05:13 +0000 Subject: [PATCH] - Fixed bug #51421 (Abstract __construct constructor argument list not enforced) --- Zend/tests/bug51421.phpt | 18 ++++++++++++++++++ Zend/zend_compile.c | 13 ++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/bug51421.phpt diff --git a/Zend/tests/bug51421.phpt b/Zend/tests/bug51421.phpt new file mode 100644 index 0000000000..825012a289 --- /dev/null +++ b/Zend/tests/bug51421.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug #51421 (Abstract __construct constructor argument list not enforced) +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of Test::__construct() must be compatible with that of TestInterface::__construct() in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 679d2a8e0b..fd00d0088a 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2909,13 +2909,20 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c { zend_uint i; - /* If it's a user function then arg_info == NULL means we don't have any parameters but we still need to do the arg number checks. We are only willing to ignore this for internal functions because extensions don't always define arg_info. */ + /* If it's a user function then arg_info == NULL means we don't have any parameters but + * we still need to do the arg number checks. We are only willing to ignore this for internal + * functions because extensions don't always define arg_info. + */ if (!proto || (!proto->common.arg_info && proto->common.type != ZEND_USER_FUNCTION)) { return 1; } - /* Checks for constructors only if they are declared in an interface */ - if ((fe->common.fn_flags & ZEND_ACC_CTOR) && !(proto->common.scope->ce_flags & ZEND_ACC_INTERFACE)) { + /* Checks for constructors only if they are declared in an interface, + * or explicitly marked as abstract + */ + if ((fe->common.fn_flags & ZEND_ACC_CTOR) + && ((proto->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0 + && (proto->common.fn_flags & ZEND_ACC_ABSTRACT) == 0)) { return 1; } -- 2.40.0