Re: Re: [RFC][Vote] Covariant Returns and Contravariant Parameters
| From: | Levi Morrison | Date: | Wed, 08 May 2019 16:50:48 +0000 |
| Subject: | Re: Re: [RFC][Vote] Covariant Returns and Contravariant Parameters | ||
| References: | 1 2 3 4 5 6 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-105644@lists.php.net to get a copy of this message | ||
On Wed, May 8, 2019 at 2:06 AM Nikita Popov <nikita.ppv@gmail.com> wrote:
>
> On Tue, Jan 22, 2019 at 6:59 PM Levi Morrison <levim@php.net> wrote:
>>
>> On Tue, Jan 15, 2019 at 1:27 PM Christoph M. Becker <cmbecker69@gmx.de> wrote:
>> >
>> > On 04.01.2019 at 20:17, Levi Morrison wrote:
>> >
>> > > I intend to close the vote in a day or two, unless I hear of new> issues from
>> > > Dmitry or others.
>> > Any news here?
>> >
>> > --
>> > Christoph M. Becker
>>
>> I sent this a week ago to Christoph only; oops.
>>
>> I have not heard any news. The vote is now closed. The RFC passes 39
>> in favor to 1 against.
>>
>> Special thanks to Nikita and Dmitry who have helped find issues and
>> review the patch. It will not be merged until the implementation
>> quality is satisfactory.
>
>
> As we're moving steadily towards 7.4 feature freeze, I'd like to discuss what we want
> to do with this RFC... The current implementation doesn't work correctly (I've done some
> more work in https://github.com/nikic/php-src/commits/variance-7.4,
> but it's also incomplete) and I have some doubts about how we're approaching this in
> general.
>
> This RFC really has two parts:
> 1. The actual variance change. This is a very straightforward change and there are no issues
> here.
> 2. The ability to check variance across multiple consecutive class definitions. This allows
> type declarations to reference classes that are declared later in the same file (but within one
> "block" of declarations).
>
> The second part is technically more dicey and somewhat arbitrary when seen in the wider scope
> of how class hoisting and early binding work in PHP: While PHP supports declaring classes "out
> of order" in some very simple cases like this...
>
> class B extends A {}
> class A {}
>
> ...it will not work for anything more involved than that, for example
>
> class C extends B {}
> class B extends A {}
> class A {}
>
> will already generate a "class not found" error.
>
> Now the variance RFC tackles one very specific part of this long-standing issue: The types
> referenced in parameter and return types may be declared later in the file (even if used variantly),
> but all other uses of the types still need to respect the declaration order.
>
> I think that we should be separating these two issues (variance and declaration order), and
> land the simple variance support in 7.4, while tackling the declaration order problem *in full*
> separately (in PHP 8, because I think we may want to make some BC breaking changes, in particular by
> making the class hoisting unconditional.)
>
> Thoughts on this approach?
>
> Nikita
I fully support this approach. I will prepare a patch for simple
variance in PHP 7.4. I intend to leave the existing test cases that
will fail without supporting consecutive declarations, but marked as
expected failures.
I think in PHP 8 we can already benefit from the [always generate
fatal error for incompatible method signatures RFC][1]. We might also
be able to make some improvements with compile-time errors on invalid
"parent::" usage (previously done for PHP 7.4 but [backed out][2]),
which might make things a bit more straightforward (it might not --
turns out parent is not exactly what I thought it was).
[1]: https://wiki.php.net/rfc/lsp_errors
[2]: https://github.com/php/php-src/commit/deb44d405eb27a6654ad9a57c1e5f641218b22a4