hi, Did we not discuss this problem recently? If I'm not mistaken the decision was to do not change the way constructors work in 5.x.
Cheers, 2010/6/28 Johannes Schlüter <johan...@schlueters.de>: > Hi, > > On Sat, 2010-06-26 at 22:05 +0000, Felipe Pena wrote: >> felipe Sat, 26 Jun 2010 22:05:13 +0000 >> >> Revision: http://svn.php.net/viewvc?view=revision&revision=300770 >> >> Log: >> - Fixed bug #51421 (Abstract __construct constructor argument list not >> enforced) >> >> Bug: http://bugs.php.net/51421 (Closed) Abstract __construct constructor >> argument list not enforced > > Won't this break compatibility? > > I'd say the change is logically correct but not sure we should break BC > there during RC. > > johannes > >> Changed paths: >> A php/php-src/branches/PHP_5_2/Zend/tests/bug51421.phpt >> U php/php-src/branches/PHP_5_2/Zend/zend_compile.c >> A php/php-src/branches/PHP_5_3/Zend/tests/bug51421.phpt >> U php/php-src/branches/PHP_5_3/Zend/zend_compile.c >> A php/php-src/trunk/Zend/tests/bug51421.phpt >> U php/php-src/trunk/Zend/zend_compile.c >> >> Added: php/php-src/branches/PHP_5_2/Zend/tests/bug51421.phpt >> =================================================================== >> --- php/php-src/branches/PHP_5_2/Zend/tests/bug51421.phpt >> (rev 0) >> +++ php/php-src/branches/PHP_5_2/Zend/tests/bug51421.phpt 2010-06-26 >> 22:05:13 UTC (rev 300770) >> @@ -0,0 +1,18 @@ >> +--TEST-- >> +Bug #51421 (Abstract __construct constructor argument list not enforced) >> +--FILE-- >> +<?php >> + >> +class ExampleClass {} >> + >> +abstract class TestInterface { >> + abstract public function __construct(ExampleClass $var); >> +} >> + >> +class Test extends TestInterface { >> + public function __construct() {} >> +} >> + >> +?> >> +--EXPECTF-- >> +Fatal error: Declaration of Test::__construct() must be compatible with >> that of TestInterface::__construct() in %s on line %d >> >> >> Property changes on: php/php-src/branches/PHP_5_2/Zend/tests/bug51421.phpt >> ___________________________________________________________________ >> Added: svn:keywords >> + Id Rev Revision >> Added: svn:eol-style >> + native >> >> Modified: php/php-src/branches/PHP_5_2/Zend/zend_compile.c >> =================================================================== >> --- php/php-src/branches/PHP_5_2/Zend/zend_compile.c 2010-06-26 21:29:56 >> UTC (rev 300769) >> +++ php/php-src/branches/PHP_5_2/Zend/zend_compile.c 2010-06-26 22:05:13 >> UTC (rev 300770) >> @@ -2009,13 +2009,20 @@ >> { >> 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; >> } >> >> >> Added: php/php-src/branches/PHP_5_3/Zend/tests/bug51421.phpt >> =================================================================== >> --- php/php-src/branches/PHP_5_3/Zend/tests/bug51421.phpt >> (rev 0) >> +++ php/php-src/branches/PHP_5_3/Zend/tests/bug51421.phpt 2010-06-26 >> 22:05:13 UTC (rev 300770) >> @@ -0,0 +1,18 @@ >> +--TEST-- >> +Bug #51421 (Abstract __construct constructor argument list not enforced) >> +--FILE-- >> +<?php >> + >> +class ExampleClass {} >> + >> +abstract class TestInterface { >> + abstract public function __construct(ExampleClass $var); >> +} >> + >> +class Test extends TestInterface { >> + public function __construct() {} >> +} >> + >> +?> >> +--EXPECTF-- >> +Fatal error: Declaration of Test::__construct() must be compatible with >> that of TestInterface::__construct() in %s on line %d >> >> >> Property changes on: php/php-src/branches/PHP_5_3/Zend/tests/bug51421.phpt >> ___________________________________________________________________ >> Added: svn:keywords >> + Id Rev Revision >> Added: svn:eol-style >> + native >> >> Modified: php/php-src/branches/PHP_5_3/Zend/zend_compile.c >> =================================================================== >> --- php/php-src/branches/PHP_5_3/Zend/zend_compile.c 2010-06-26 21:29:56 >> UTC (rev 300769) >> +++ php/php-src/branches/PHP_5_3/Zend/zend_compile.c 2010-06-26 22:05:13 >> UTC (rev 300770) >> @@ -2532,13 +2532,20 @@ >> { >> 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; >> } >> >> >> Added: php/php-src/trunk/Zend/tests/bug51421.phpt >> =================================================================== >> --- php/php-src/trunk/Zend/tests/bug51421.phpt >> (rev 0) >> +++ php/php-src/trunk/Zend/tests/bug51421.phpt 2010-06-26 22:05:13 >> UTC (rev 300770) >> @@ -0,0 +1,18 @@ >> +--TEST-- >> +Bug #51421 (Abstract __construct constructor argument list not enforced) >> +--FILE-- >> +<?php >> + >> +class ExampleClass {} >> + >> +abstract class TestInterface { >> + abstract public function __construct(ExampleClass $var); >> +} >> + >> +class Test extends TestInterface { >> + public function __construct() {} >> +} >> + >> +?> >> +--EXPECTF-- >> +Fatal error: Declaration of Test::__construct() must be compatible with >> that of TestInterface::__construct() in %s on line %d >> >> >> Property changes on: php/php-src/trunk/Zend/tests/bug51421.phpt >> ___________________________________________________________________ >> Added: svn:keywords >> + Id Rev Revision >> Added: svn:eol-style >> + native >> >> Modified: php/php-src/trunk/Zend/zend_compile.c >> =================================================================== >> --- php/php-src/trunk/Zend/zend_compile.c 2010-06-26 21:29:56 UTC (rev >> 300769) >> +++ php/php-src/trunk/Zend/zend_compile.c 2010-06-26 22:05:13 UTC (rev >> 300770) >> @@ -2909,13 +2909,20 @@ >> { >> 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; >> } >> >> >> -- >> PHP CVS Mailing List (http://www.php.net/) >> To unsubscribe, visit: http://www.php.net/unsub.php > > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > > -- Pierre @pierrejoye | http://blog.thepimp.net | http://www.libgd.org -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php