Re: Re: [RFC][Vote] Covariant Returns and Contravariant Parameters

From: 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

« previous php.internals (#105644) next »