PHP's support to contravariance and covariance
| From: | guilhermeblanco@gmail.com | Date: | Tue, 31 Jan 2017 18:30:13 +0000 |
| Subject: | PHP's support to contravariance and covariance | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-98085@lists.php.net to get a copy of this message | ||
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.