On Sat, Nov 7, 2020, at 2:47 PM, Sara Golemon wrote:
> On Sat, Nov 7, 2020 at 9:33 AM Olle Härstedt <olleharst...@gmail.com> wrote:
> 
> > 2020-11-07 15:12 GMT, Eugene Sidelnyk <zsidel...@gmail.com>:
> > > function foo(A & B & E $object) {
> > >   // some work
> > >   var_dump($object);
> > > }
> > >
> >
> > You mean intersections? Psalm supports this notation.
> >
> >
> IIRC we discussed intersection data types when union types were on the
> table and we settled on a "take it slow" position.  That said, union types
> are... **checks notes**... oh, wow.  Actually still pretty new (introduced
> in 8.0).
> 
> My conservative side wants to wait and see what the community does with
> unions, but if static analyzers are already providing this functionality,
> then maybe the community has already made its position known.

I would be very in favor of intersection types.  It's not really useful for 
primitives, but with interfaces it becomes quite handy.

> Questions to answer in any RFC on this topic:
> 1. Do we support complex types combining unions with intersections?
> e.g. function foo(((countable&traversable) | (stringable|jsonserializable))
> $obj) { ... }
> Pros: Super descriptive
> Cons: Super ugly
> My opinion: Maybe, but not immediately.  Let simple unions/intersections
> bake for a version or two.

I'd favor a type being exclusively unions or intersections.  No mixing, with 
the possible exception of allowing the type to be nullable.  So Foo & Bar is 
OK, Bar | Baz is OK, but Foo & Bar | Baz is just more complex than any 
reasonable person should be doing.

> 2. Do we also bring in type alliasing?
> e.g.
> type CountableTraversable = Countable & Traversable;
> type AllTheSerializations = Stringable & JSONSerializable;
> function foo(CountableTraversable | AllTheSerializations $obj) { ... }
> Pros: Can make a given code base more readable once you know the types
> Cons: Can make figuring out types in a new codebase harder.
> My opinion: Yes.  Sooner the better.

This is a separate RFC from intersection types and should be submitted 
separately.  That said, yes please!

> 3. How does this intersect (pun!) with coersion when strict_types=0 ?
> Initial thoughts: Probably very poorly.

I'm unclear how/why it would?  Please explain?

> 4. Should we be considering other bloat^W features?
> a. Exclusive Union:   type SingleSerialization = Stringable ^
> JSONSerializable;  // XOR: Must be one, but not both
> b. Blacklist:   type AnythingButDOM = !DOMElement;
> My opinion: Hell no.  Just spitballin'.
> 
> -Sara

Hard pass.  At that point, make separate methods.

--Larry Garfield

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to