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 CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php