On Mon, Jul 19, 2021 at 4:26 PM Nicolas Grekas <nicolas.gre...@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 <dan...@basereality.com> 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

Reply via email to