Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:115533 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 45835 invoked from network); 20 Jul 2021 14:41:28 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 20 Jul 2021 14:41:28 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 35DAE180508 for ; Tue, 20 Jul 2021 08:06:44 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-1.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,FREEMAIL_REPLY, HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-ej1-f48.google.com (mail-ej1-f48.google.com [209.85.218.48]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Tue, 20 Jul 2021 08:06:43 -0700 (PDT) Received: by mail-ej1-f48.google.com with SMTP id nd37so34825223ejc.3 for ; Tue, 20 Jul 2021 08:06:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=266FOSobsSJqSVNrKzHVBVHmOvPHH4AqDrDT818XaCE=; b=kOD/E8YmsmNCpUT8kUU1cPls/duhxpPJnwURVClmTvVTkzS9PArgorOCEYnBbaBAnQ mJjDaNZPrJJUfNrCpk+SAsd1eWBcSmlACFbIV5POmGy1r0ia3vSnBm/dDsuSbtJZtqcL hevfkGUlomjHqd1ZDRL1gxXTD9I3OL03GdU1oMpeBce3PxHLVFWN3+umQ1Esq1iyaao7 f3vSVngB4eqo9R2b9KUTilf8gRyc7EiXBpqyTounbLG2DkPi3llQrICogMwCq8KaY4Oc 523iZRcc0VK9scEVtMKZTcFmGGCcUR6yTjEM84FVPOw3XFA9YTZVkpNh9jy9TYC5E1sF 6Nbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=266FOSobsSJqSVNrKzHVBVHmOvPHH4AqDrDT818XaCE=; b=fabqsA/q93Z3cl6U1qZNJLTlBe/CyMMJRrzkrMC/Wdpi6XgtDNXcHkstCi/Ag3QHPD 7aLa4ExF62c/zRtIdBHaMcmeuD7DbdOf6tt4lR7F6lQ9qYL/AoioVDW/zTGfRUInJmhg CXyADIptVXo+2zuRzJfQlkrAG5la8xDW19MkXyfwFVHU3fGW0QX3Z+KDIv85N1hbXqf2 lE8Ue9dvdM98Zeb1A9dD3pTfJb6jHqh2BOcoGwtMOmfBubp0P1djK+Tv5g9GcP0/nqxN rs4T0ZbcaSCejt5xotJqZJ1OKiZcmnvo6XNbHGLwqra+ppApluV8hDGuq0NuKApBkW2G AxLQ== X-Gm-Message-State: AOAM530euQ44VPuE5lRCYcio1WmS4Cad1Ajc3TMmLlGEsPjJI+ulVgBU DDQr7VR4Gjq0rVE/jBMt/uW4xZauHtNXNNLSCJw= X-Google-Smtp-Source: ABdhPJzBKjB6y9cmRUMorjJmN2uvxKmXwX5FEE8zaHucH9TZENd5tH1R+RhbL7BrmF5fPM+T8fxbIGPHO5hjq42cjTc= X-Received: by 2002:a17:907:1c01:: with SMTP id nc1mr31780549ejc.504.1626793601523; Tue, 20 Jul 2021 08:06:41 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Tue, 20 Jul 2021 17:06:29 +0200 Message-ID: To: Joe Watkins Cc: Nikita Popov , Guilliam Xavier , Dan Ackroyd , Nicolas Grekas , PHP Internals List Content-Type: multipart/alternative; boundary="000000000000bde77105c78f66a6" Subject: Re: [PHP-DEV] intersection types and null for defaults, properties and return types From: george.banyard@gmail.com ("G. P. B.") --000000000000bde77105c78f66a6 Content-Type: text/plain; charset="UTF-8" On Tue, 20 Jul 2021 at 14:41, Joe Watkins wrote: > Agree, an RFC looks like the only way. > > This is not worth delaying a release for, nor is it worth postponing the > feature freeze date. > > It seems reasonable to fix this after freeze, would prefer to reach > consensus before RC stage. > > Cheers > Joe > > On Tue, 20 Jul 2021 at 13:07, Nikita Popov wrote: > >> On Mon, Jul 19, 2021 at 8:16 PM G. P. B. >> wrote: >> >> > On Mon, 19 Jul 2021 at 18:26, Guilliam Xavier < >> guilliam.xavier@gmail.com> >> > wrote: >> > >> > > On Mon, Jul 19, 2021 at 4:26 PM Nicolas Grekas < >> nicolas.grekas@gmail.com >> > > >> > > wrote: >> > > >> > > > >> > > > https://github.com/php/php-src/pull/7259 >> > > > >> > > >> > > Great! Thanks! Interesting how it works out-of-the-box with just this >> > > addition in Zend/zend_language_parser.y: >> > > >> > > ```diff >> > > type_expr: >> > > type { $$ = $1; } >> > > | '?' type { $$ = $2; $$->attr |= ZEND_TYPE_NULLABLE; } >> > > | union_type { $$ = $1; } >> > > | intersection_type { $$ = $1; } >> > > + | '?' intersection_type { $$ = $2; $$->attr |= ZEND_TYPE_NULLABLE; } >> > > ; >> > > ``` >> > > >> > > On Mon, Jul 19, 2021 at 5:09 PM Dan Ackroyd >> > > wrote: >> > > >> > > > nicolas-grekas wrote on the PR: >> > > > > ?X&Y cannot be confused with >> > > > >> > > > It confused me. A compiler might understand it, but as a human I >> have >> > > > trouble understanding it. >> > > > >> > > > Trowski wrote: >> > > > > The syntax should be either ?(X&Y) or (X&Y)|null >> > > > >> > > > Non-ambiguous syntax is much better than ambiguous syntax. >> > > > >> > > >> > > Maybe it's just a matter of habit? >> > > For instance I got used to seeing things like `!$x = f()` (e.g. `if >> (!$x >> > = >> > > f()) { throw /*...*/; } /* use $x */`) because some CS consider >> explicit >> > > parentheses in `!($x = f())` redundant (as PHP has a special case that >> > > "overrides" the normal precedence `(!$x) = f()` which would be an >> error). >> > > If you first consider `X&Y` as a type "unit", then it makes sense to >> make >> > > it "nullable" by prefixing it with `?`, I think? >> > > >> > > >> > > > >> > > > But this discussion is moot for 8.1. >> > > > >> > > > This limitation might make intersection types not be considered >> usable >> > > > by some projects, but the feature freeze is today. >> > > > >> > > >> > > Which can also be reversed: "The feature freeze is today, but this >> > > limitation might make intersection types not be considered usable by >> some >> > > projects"? (playing devil's advocate, I don't master the process) >> > > >> > > Regards, >> > > >> > > -- >> > > Guilliam Xavier >> > > >> > >> > Since when is usability for a specific project a consideration an RFC >> needs >> > to have? >> > If Symfony can't use it in its current state tough luck, >> > I'm sure plenty of other projects can, especially now that using 'new >> > Class' is possible as a default object value. >> > >> > I frankly don't care about being able to have some sort of partial union >> > possible with the usage of intersection types, >> > because it seems the machinery in the engine which makes null work, >> should >> > also allow any standard PHP types as those are part of a bitflag and >> > handling variance with them seems to work just fine... >> > >> > But for the love of god, this proposed syntax is horrendous, saying >> ?X&Y is >> > unambiguous is disingenuous. >> > It can either mean (?X)&Y = (X|null)&Y or ?(X&Y) = (X&Y)|null, the >> former >> > one being bogus as null&Y is an impossible type, something which should >> > error out to point out a potential bug in the same way we do for >> redundant >> > types that we know at compile time. >> > And if we allow this syntax then we really should be allowing ?A|B >> which is >> > dumb. >> > (and no ?X&Y is NOT something I consider forward compatible when it is >> just >> > going to become one more edge case we need to maintain because people >> have >> > no patience). >> > >> > If ?(X&Y) is allowed then ?(A|B) should also be allowed, and that needs >> an >> > RFC for sure due to the controversy it had in the union type RFC. >> > >> > The only remaining sensible choice is (X&Y)|null / null|(X&Y), but as I >> > said above if the machinery for null is there it must mean the machinery >> > for int/string/array/float/bool is also there, and frankly being able >> to do >> > something like (Traversable&Countable)|array is also extremely valuable, >> > maybe even more than nullability, but in any case this is going to be >> > confusing for end-users why only null (or standard PHP types) can be >> > combined in a union with intersection types. >> > >> > That's one reason why it's only pure intersection types, if I had more >> time >> > (or for crying out loud somebody would have paid me) to work on this I >> > would have loved to get full composite types working. >> > >> > And I find it frankly insulting that in the four month this RFC has been >> > published for discussion, with multiple push backs for voting due to >> bugs >> > and me wanting that people know what implementation is - for the most >> part >> > - going to land in php-src, this specific point has not been raised. >> > It just feels like you are pissing on 6+ months of *unpaid* work I did >> > because it doesn't suit your needs, and you just realised that and so >> > decided to throw a wrench into a carefully crafted RFC to "fix" it by >> using >> > a Twitter mob to put pressure on us/me. >> > >> > Maybe this topic didn't come up because for nearly everyone else "Pure >> > Intersection Types" means what it says on the can, moreso that in the >> RFC >> > the following line: >> > > This means it would *not* be possible to mix intersection and union >> types >> > together such as A&B|C, this is left as a future scope >> > makes it clear, and most voters also understood that '?' is not a type >> > "flag" but is syntactic sugar for 'null|'. >> > >> > There are plenty of issues with the implementation, from the whack >> parser >> > hack, the non support for static/parent/self, to the complexity of the >> > variance code, but I made all of those clear because they made *me* >> > uncomfortable with the implementation. >> > So if you are going to force this crappy syntax, then I'd rather axe >> this >> > feature completely (and nobody can use/play with it) then have >> something I >> > do not accept, nor are forced to accept because of a vote, land in core >> > making PHP even more of an inconsistent joke. >> > >> >> Hey George, >> >> I don't think there's been any malicious intent here -- it was obvious to >> you and I that not allowing unions implies not allowing nullability, but I >> can see how people less familiar with our type system implementation would >> not make that connection. After all, we do provide the separate ?T syntax, >> even if it is an internal alias for T|null. >> >> It's an unfortunate fact of the RFC process that concerns are sometimes >> only raised when voting starts and people start looking at the >> implementation -- or in this case, when they test the implementation after >> it has landed... >> >> In any case, I think it's pretty clear by now that there are some fairly >> strong opinions both on what the syntax for this should be (between ?X&Y, >> ?(X&Y), (X&Y)|null and X&Y|null, all of which have reasonable arguments >> for >> and against) and whether we should have this special case at all. I'm not >> sure we will be able to reach a sufficient consensus in this discussion. >> >> For that reason, I think this change should go through the RFC process. We >> can grant this an exemption from the feature freeze (as a clarification of >> an accepted proposal), but it should still go through the process. >> >> Regards, >> Nikita >> > If RMs and everyone else is okay for this being handled post feature freeze via an RFC, I am fine with it too. Best regards George P. Banyard --000000000000bde77105c78f66a6--