Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:92921 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 80834 invoked from network); 29 Apr 2016 08:55:37 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 29 Apr 2016 08:55:37 -0000 Authentication-Results: pb1.pair.com header.from=jesseschalken@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=jesseschalken@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.223.171 as permitted sender) X-PHP-List-Original-Sender: jesseschalken@gmail.com X-Host-Fingerprint: 209.85.223.171 mail-io0-f171.google.com Received: from [209.85.223.171] ([209.85.223.171:36408] helo=mail-io0-f171.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 65/E2-60902-78123275 for ; Fri, 29 Apr 2016 04:55:36 -0400 Received: by mail-io0-f171.google.com with SMTP id u185so117810709iod.3 for ; Fri, 29 Apr 2016 01:55:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc; bh=UpX8HABsOctcnMC8WacWlheJsXvinryx6oibRLyKUg4=; b=PXAWRtl9b5z3zexp/S9ch75K4AkySxFQWYmZw5ovy1C3GCccO/gqOzv5fVQqrUHZvu oj+FQZ5KIpjFwUTHq8hyhEor0YwWnLkvVHiz3hj4119aBgbqIJi3cE2vgZAKbcThsFfX msVq4lK8Ug5rsO7yjgebYVno2nS6SrUDJ4EROxtoX0gW5QDkWSHOrG87zy8qA4rWDTe8 V/AELB3OD3y3w5CYLaKWVyGyUHAVXbdqQrcIED1MVbPpVrVQZ4DtgEY5nmoBtxphDJbo +CNp14vEMPW4zgkoVaP7Ofczx8b/PonPk2U/Fp4Ww4nSemRzMHcWGT4cqYiCkozzGemy oX8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:cc; bh=UpX8HABsOctcnMC8WacWlheJsXvinryx6oibRLyKUg4=; b=VJjTkfkddD6+x3amcKCN1kJ7rAQbriqBaPvJRVP7TlmI+/JOE469ky8s1ViGBdGzdw f4j4RXNa+3J4/oS5Yc7+3XkX1Xvcnb065b3ymcr1dds+N+e/UlwbDecjebM4PO5IRcry 6DHwHcBC10QqeHq6UB0/4DHrpEoOzRtESDE6/Mp0nfrQkZW8aRkB6Q5T2OfvVH8MAgjK l89QNuAD/bkipaAa2ga0CMK3MaqSwSOTiFcEORASbq99TPSqoo+Ex8M/K634/xNyiA8K 3G13xIEHYuXjLZtTpBLe3iwItSm8q0Md6Wld7tiMjBFKg6koj8ms0xGfCq+nqCCZ2CWU igyA== X-Gm-Message-State: AOPr4FUbf0T/kRbf7WD8KR1IswA0sFLDBy2D3u/7Q9SUFD+e7nG4BhxE+g+Gt/7ialz6Ni2xQuozs/3Z76SPOA== MIME-Version: 1.0 X-Received: by 10.107.137.166 with SMTP id t38mr23342607ioi.31.1461920132697; Fri, 29 Apr 2016 01:55:32 -0700 (PDT) Sender: jesseschalken@gmail.com Received: by 10.79.139.133 with HTTP; Fri, 29 Apr 2016 01:55:32 -0700 (PDT) In-Reply-To: References: <3cc8a4c7-2640-11ae-a67b-06f909ac1e27@texthtml.net> <57173859.4080501@rochette.cc> <013101d19ff8$596b6010$0c422030$@tutteli.ch> Date: Fri, 29 Apr 2016 18:55:32 +1000 X-Google-Sender-Auth: tFFawiwvEvplCK6YnQlQ--67sug Message-ID: To: "guilhermeblanco@gmail.com" Cc: Robert Stoll , Rasmus Schultz , Josh Di Fabio , Dominic Grostate , Mathieu Rochette , "Ben Scholzen 'DASPRiD'" , Sara Golemon , PHP internals , Mathieu Rochette Content-Type: multipart/alternative; boundary=001a113ebd8033186405319bce9d Subject: Re: [PHP-DEV] [RFC:generics] From: me@jesseschalken.com (Jesse Schalken) --001a113ebd8033186405319bce9d Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, Apr 27, 2016 at 6:50 AM, guilhermeblanco@gmail.com < guilhermeblanco@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 cou= ld > 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 > {}, 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 typ= es > 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. > > 3- Unbounded wildcards (?) > > It wouldn't be necessary in the context of PHP. Why? > Once we introduce Generics, the difference between process(List $list) an= d > 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, you can only > add As to the list, but no subtypes. When you declare List, > 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 would be enough, and PHP wouldn't > support adding A and A only. > You can add subtypes of A to a List in Java. What List means is that the list itself may be a list of any type, provided that type is compatible with A. So if B extends A, List is compatible with List, and when reading items you can assume they will be compatible with A (since B extends A) but you can't add an A (because it's actually a list of Bs). Similarly, List means it may be a list of A or some super type of A. So if A extends C, List is compatible with List, and you can add an A (because A is compatible with C) but when reading items you can't assume they're going to be As (because it's actually a list of Cs). This is my understanding of variance behaviour and notation in the three languages I'm most familiar with: Covariance (Foo is a subtype of Foo) Java Foo at usage Methods accepting T as parameter cannot be called Hack Foo<+T> at declaration Methods accepting T as parameter cannot be defined C# Foo at declaration Methods accepting T as parameter cannot be defined Contravariance (Foo is a subtype of Foo) Java Foo at usage Methods returning T can be called but return Object Hack Foo<-T> at declaration Methods returning T cannot be defined C# Foo at declaration Methods returning T cannot be defined Invariance (no relationship between Foo and Foo) Java Foo at usage Methods accepting T and returning T can both be called Hack Foo at declaration Methods accepting T and returning T can bot= h be defined C# Foo at declaration Methods accepting T and returning T can bot= h be defined (There are more general rules for method signatures when T is used as the parameter for another generic type, but I can't remember what they are.) I can't see variance mentioned in the RFC, but when I asked about it when the RFC was posted on Reddit, Rasmus said the type parameters would always be covariant, so Foo in PHP as an annotation would be equivalent to Foo in Java, even though this has the opposite of the intended effect if Foo has methods which accept a parameter of the generic type, such as something like List::add(T $element), Callback::run(T $data) or Box::setContents(T $contents). My view is that PHP's generics should be invariant to start with (generic arrays can still be covariant of course, since they are passed by value), maintaining type safety and matching the behaviour of Java, Hack and C# for type parameters without variance annotations, and variance syntax should be added later as another RFC as demand arises. 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 wrote: > > > > > > > > -----Urspr=C3=BCngliche Nachricht----- > > > Von: Rasmus Schultz [mailto:rasmus@mindplay.dk] > > > Gesendet: Montag, 25. April 2016 18:09 > > > An: Josh Di Fabio > > > Cc: Dominic Grostate; Guilherme Blanco; Mathieu Rochette; Ben Scholze= n > > '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, s= o > > I'd like to suggest simply using a ":" ... as in: > > > > > > class A { ... } > > > > In this case I would suggest to use class A 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 i= n > > 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 > > > wrote: > > > > On Wed, Apr 20, 2016 at 8:17 PM, Dominic Grostate > > > > 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 {} > > > >> class Foo {} > > > >> > > > >> 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 > > > > 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 {} > > > >> class Foo {} > > > >> > > > >> 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 $func) { > > > >> > > > >> } > > > >> > > > >> However, an RFC already exists which is very similar to this featu= re > > > >> 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 exclud= e > > > >> this part in favour of a separate or later RFC. > > > >> Initially the proposal included generic arrays "array". > > > >> 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 informati= on > > > >> 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 > --001a113ebd8033186405319bce9d--