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

Reply via email to