On Wed, Apr 27, 2016 at 6:50 AM, guilhermebla...@gmail.com <
guilhermebla...@gmail.com> wrote:

> Hi all,
>
> Yesterday I spent a considerable 2h talking about Generics in Doctrine
> channel.
> We discussed the specifics of each boundary that PHP's implementation could
> take advantage. Here are our findings, which I'll illustrate using Java
> equivalents:
>
> 1- Upper bounds (T extends A)
>
> We all understood they're required. Whenever you mention class Foo<T is A>
> {}, we're talking that T can be A or any of its subtypes.
> Also, we debated over intersection types. It's an edge case, and its
> support could be done as a subsequent RFC once union and intersection types
> gets resolved.
>
> 2- Lower bounds (T super A)
>
> It was just not possible to come up with a single use case or possibility.
> It not only violates Liskov, but it also doesn't make any sense in the
> context of PHP.
> When we debate about Java, it does make sense because of polymorphism and
> the requirement removal of implementing multiple methods.
>


I didn't understand the point of lower bound until I read this:
http://hhvm.com/blog/9215/covariance-contravariance-and-super-type-constraints

For example, this is a correctly typed array_merge() (ignoring the fact
that it's variadic, for simplicity):

function array_merge<T>(array<T> $a, array<T> $b):array<T> { ... }


(Keeping in mind that array<T> is covariant in T, so I can do
array_merge([new A()], [new B()]) and get an array<C>, provided A and B are
compatible with C.)

But if you have a class which has similar functionality, you would have to
type it as:

class Foo<T> {

    public function merge<V super T>(Foo<V> $o):Foo<V> { ... }

}


because the type of the result doesn't have to be Foo<T>, it can be Foo of
anything (V), as long as T of the current class is compatible with it (V
super T).



> 3- Unbounded wildcards (?)
>
> It wouldn't be necessary in the context of PHP. Why?
> Once we introduce Generics, the difference between process(List $list) and
> process(List<?> $list) would be none, as due to PHP's nature.
>
> 4- Upper bounded wildcard (? extends A)
>
> Again, invalid in the context of PHP. Let me explain why...
> In Java context, whenever you declare something as List<A>, you can only
> add As to the list, but no subtypes. When you declare List<? extends A>,
> you can add A and also any of its subtypes.
> PHP is loose in this restriction, so there's no way of strict-ing to only A
> but not subtypes. Defining as List<A> would be enough, and PHP wouldn't
> support adding A and A only.
>
> 5- Lower bounded wildcard (? super A)
>
> Applies the same concept of #2. PHP doesn't need it as it doesn't fully
> support polymorphism.
>
> 6- Reflection
>
> We discussed over an example I extracted from a piece of code I currently
> work on. We came with several ideas, but couldn't wrap up (but we're 80%) a
> valid approach. The example we debated was this one:
> https://gist.github.com/guilhermeblanco/56ec0e11e7b029c2cfdcaf6fe2323742
>
>
>
>
> So I'll have to say sorry for poking around of "missing implementation"
> while in reality most of them cannot be applied in the context of PHP.
> I've reviewed the RFC again and it mostly makes sense surrounding
> boundaries. I still have to talk about diamond operator and constructor
> generic type.
>
>
> []s,
>
>
> On Tue, Apr 26, 2016 at 4:15 PM, Robert Stoll <p...@tutteli.ch> wrote:
>
> >
> >
> > > -----Ursprüngliche Nachricht-----
> > > Von: Rasmus Schultz [mailto:ras...@mindplay.dk]
> > > Gesendet: Montag, 25. April 2016 18:09
> > > An: Josh Di Fabio
> > > Cc: Dominic Grostate; Guilherme Blanco; Mathieu Rochette; Ben Scholzen
> > 'DASPRiD'; Sara Golemon; PHP internals; Mathieu
> > > Rochette
> > > Betreff: Re: [PHP-DEV] [RFC:generics]
> > >
> > > > I really don't like 'as' in this context, even if Hack uses it, as it
> > > > doesn't reflect in English terms what the code is doing. As others
> > > > have already said, it reads as if 'T' is being aliased to 'Bar'.
> > >
> > > I second that.
> > >
> > > I hear the concerns about adding another reserved word "is" though, so
> > I'd like to suggest simply using a ":" ... as in:
> > >
> > >     class A<T : T1> { ... }
> >
> > In this case I would suggest to use class A<T <: T1> which leaves room
> > open to define lower bounds later on (either with <: as well or with :>
> as
> > in scala)
> >
> > >
> > > Consistent with return type-hints, it should feel like home?
> > >
> > > For sure nobody wants to type out "instanceof", and (as pointed out in
> > the RFC) the instanceof operator checks the type of
> > > an object, which is *not* what this is doing - a type argument is not
> an
> > "instance of" anything. The ":" is more neutral in that
> > > regard maybe?
> > >
> > >
> > > On Thu, Apr 21, 2016 at 10:32 AM, Josh Di Fabio <joshdifa...@gmail.com
> >
> > wrote:
> > > > On Wed, Apr 20, 2016 at 8:17 PM, Dominic Grostate
> > > > <codekest...@googlemail.com> wrote:
> > > >> Thanks for you're input everyone.
> > > >>
> > > >> So far, we have read some ideas for handling upper bounds, or
> > > >> multiple there of.
> > > >> The preferred keywords appear to be either "as" or "instanceof".
> > > >>
> > > >> class Foo<T as Bar> {}
> > > >> class Foo<T instanceof Bar> {}
> > > >>
> > > >> We would like to know for sure then if everyone is largely against
> > > >> the addition of an "is" keyword, in favour of one of the other two.
> > > >>
> > > >
> > > > I really don't like 'as' in this context, even if Hack uses it, as it
> > > > doesn't reflect in English terms what the code is doing. As others
> > > > have already said, it reads as if 'T' is being aliased to 'Bar'.
> > > >
> > > > On Wed, Apr 20, 2016 at 8:17 PM, Dominic Grostate
> > > > <codekest...@googlemail.com> wrote:
> > > >> Thanks for you're input everyone.
> > > >>
> > > >> So far, we have read some ideas for handling upper bounds, or
> > > >> multiple there of.
> > > >> The preferred keywords appear to be either "as" or "instanceof".
> > > >>
> > > >> class Foo<T as Bar> {}
> > > >> class Foo<T instanceof Bar> {}
> > > >>
> > > >> We would like to know for sure then if everyone is largely against
> > > >> the addition of an "is" keyword, in favour of one of the other two.
> > > >>
> > > >> ----------------
> > > >>
> > > >> There is also a desire to include unions and intersections.
> > > >> Presently though, this feature feels tied in with
> > > >> https://wiki.php.net/rfc/union_types meaning if union types are
> > > >> approved, then generics would have to support them as well.
> Likewise
> > > >> if this feature becomes approved in generics, it would make sense to
> > > >> support them in regular type hints as well.
> > > >>
> > > >> ----------------
> > > >>
> > > >> The RFC makes a reference to generic closures, which may look
> > > >> something like
> > > >> this:
> > > >>
> > > >> function my_function(callable<Foo, Bar> $func) {
> > > >>
> > > >> }
> > > >>
> > > >> However, an RFC already exists which is very similar to this feature
> > > >> at https://wiki.php.net/rfc/callable-types
> > > >> As it currently standards these RFCs appear incompatible with each
> > > >> other (please correct me if I am wrong).
> > > >>
> > > >> My question about this is would you prefer the generics RFC exclude
> > > >> this part in favour of a separate or later RFC.
> > > >> Initially the proposal included generic arrays "array<string>".
> > > >> However to ease the implementation it was decided that should be a
> > separate feature.
> > > >> So we'd like to find out if everyone else feels the same way about
> > > >> callable types.
> > > >>
> > > >> ----------------
> > > >>
> > > >> This RFC currently doesn't specify in detail how reflection would
> > > >> work.  We have attempted a few API designs, but due to generic
> > classes being ...
> > > >> generic, it is difficult to find a suitable way to glean information
> > > >> about a class in a backwards compatible manner.  So we will need
> some
> > > >> help on this one.
> > > >>
> > > >> -----------------
> > > >>
> > > >> Aside from these top issues on our own list, however does everyone
> > > >> feel about the proposal in general?
> > > >> As the RFC is still in draft, we will continue to make changes to it
> > > >> as more popular idea pop up, so please continue.
> > > >>
> > > >> Thanks.
> > > >>
> > > >> PS: I wasn't properly subscribed to the mailing list, so I missed a
> > > >> few important messages that were mailed directly to internals, but
> > > >> hopefully I've managed to fix that now.
> > >
> > > --
> > > PHP Internals - PHP Runtime Development Mailing List To unsubscribe,
> > visit: http://www.php.net/unsub.php
> >
> >
> >
>
>
> --
> Guilherme Blanco
> Lead Architect at E-Block
>

Reply via email to