From: Marcus Boerger Date: Wed, 10 May 2006 01:23:55 +0000 (+0000) Subject: - MFH Constructors in interfaces X-Git-Tag: php-5.2.0RC1~624 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=edfe649c6b1749e3e636a58e42f269c01333132d;p=php - MFH Constructors in interfaces --- diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index e6ccf2e310..1330f295d0 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1920,8 +1920,8 @@ static zend_bool zend_do_perform_implementation_check(zend_function *fe, zend_fu return 1; } - /* No implementation checks for constructors */ - if (fe->common.fn_flags & ZEND_ACC_CTOR) { + /* 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)) { return 1; } diff --git a/tests/classes/ctor_in_interface_01.phpt b/tests/classes/ctor_in_interface_01.phpt new file mode 100755 index 0000000000..f6f9b66eab --- /dev/null +++ b/tests/classes/ctor_in_interface_01.phpt @@ -0,0 +1,19 @@ +--TEST-- +ZE2 A class constructor must keep the signature of an interface +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of implem::__construct() must be compatible with that of constr::__construct() in %s on line %d diff --git a/tests/classes/ctor_in_interface_02.phpt b/tests/classes/ctor_in_interface_02.phpt new file mode 100755 index 0000000000..a0dfe87788 --- /dev/null +++ b/tests/classes/ctor_in_interface_02.phpt @@ -0,0 +1,35 @@ +--TEST-- +ZE2 A class constructor must keep the signature of all interfaces +--FILE-- + +--EXPECTF-- +Fatal error: Can't inherit abstract function constr3::__construct() (previously declared abstract in constr1) in %s on line %d diff --git a/tests/classes/ctor_in_interface_03.phpt b/tests/classes/ctor_in_interface_03.phpt new file mode 100755 index 0000000000..953d6822fd --- /dev/null +++ b/tests/classes/ctor_in_interface_03.phpt @@ -0,0 +1,23 @@ +--TEST-- +ZE2 A class constructor must keep the signature of base class interfaces +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of derived::__construct() must be compatible with that of constr::__construct() in %s on line %d diff --git a/tests/classes/ctor_in_interface_04.phpt b/tests/classes/ctor_in_interface_04.phpt new file mode 100755 index 0000000000..0016244c18 --- /dev/null +++ b/tests/classes/ctor_in_interface_04.phpt @@ -0,0 +1,26 @@ +--TEST-- +ZE2 A class constructor must keep the signature of base class interfaces +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of derived::__construct() must be compatible with that of constr::__construct() in %s on line %d