Re: PHP's support to contravariance and covariance
| From: | Rasmus Schultz | Date: | Tue, 31 Jan 2017 19:30:28 +0000 |
| Subject: | Re: PHP's support to contravariance and covariance | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-98089@lists.php.net to get a copy of this message | ||
We were talking about this exact issue at work today.
Supporting this for interfaces would be particularly useful - if an
implementation better than satisfies the requirements defined by an
interface, it should be able to implement that interface.
I'd be very happy to see an RFC for this :-)
On Tue, Jan 31, 2017 at 7:30 PM, guilhermeblanco@gmail.com <
guilhermeblanco@gmail.com> wrote:
> Hi internals,
>
> During my regular open source work, I realized that PHP yet do not support
> contravariance and covariance for user classes.
>
> Some examples that I found that could be really easy to implement and
> useful to end user are highlighted here:
>
> - contravariance.php - https://3v4l.org/I3v0u
> - covariance.php - https://3v4l.org/i79O5
>
> For all those lazy people that don't want to open 2 new tabs to understand
> what I mean, here's a more elaborate example covering both scenarios:
>
> <?php
>
> class A {}
>
> class B extends A {}
>
> class Foo {
> public function bar(B $b) : A {}
> }
>
> class Woo extends Foo {
> public function bar(A $b) : B {}
> }
>
> $w = new Woo();
>
> Basically, here are the highlights:
> - method arguments are ok to reference wider parameter types (and we just
> approved the PR for Parameter Type Widening) - this is what we call
> contravariant, as contra inheritance direction
> - return types are ok to enforce strictness for subtypes - this is what we
> call covariant, as Woo is a subtype of Foo
>
> I've walked through PHP source and it looks like the only needed place to
> modify is
>
> https://github.com/php/php-src/blob/master/Zend/zend_inheritance.c#L184,
> which would require to be decoupled in 2 functions to check which direction
> is should support (covariance or contravariance).
>
> Is there anything else that I am missing? I'm happy to write an RFC for
> that... =)
>
> Cheers,
>
> --
> Guilherme Blanco
> Senior Technical Architect at Huge Inc.
>