Re: Re: svn: /php/php-src/ branches/PHP_5_2/Zend/tests/bug51421.phpt branches/PHP_5_2/Zend/zend_compile.c branches/PHP_5_3/Zend/tests/bug51421.phpt
branches/PHP_5_3/Zend/zend_compile.c trunk/Zend/tests/bug51421.phpt trunk/Zend/zen
| From: | Pierre Joye | Date: | Mon, 28 Jun 2010 09:05:55 +0000 |
| Subject: | Re: Re: svn: /php/php-src/ branches/PHP_5_2/Zend/tests/bug51421.phpt branches/PHP_5_2/Zend/zend_compile.c branches/PHP_5_3/Zend/tests/bug51421.phpt branches/PHP_5_3/Zend/zend_compile.c trunk/Zend/tests/bug51421.phpt trunk/Zend/zen |
||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-48977@lists.php.net to get a copy of this message | ||
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 <johannes@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