-
-
Save IMSoP/bec95b177e8ae297983984db94ba99ef to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Source<out T> { | |
public static function returnOne(): T { ... } | |
} | |
class Sink<in T> { | |
public static function consumeOne(T $item): void { ... } | |
} | |
class Foo {} | |
class SpecialFoo extends Foo {} | |
var_dump(new Source<Foo> instanceof Source<Foo>); // bool(true) | |
var_dump(new Source<SpecialFoo> instanceof Source<Foo>); // bool(true): returning a SpecialFoo means you return a Foo | |
var_dump(new Source<Foo> instanceof Source<SpecialFoo>); // bool(false): class may return a Foo which is not a SpecialFoo | |
var_dump(new Sink<Foo> instanceof Sink<Foo>); // bool(true) | |
var_dump(new Sink<SpecialFoo> instanceof Sink<Foo>); // bool(false): class will refuse a Foo which is not a SpecialFoo | |
var_dump(new Sink<Foo> instanceof Sink<SpecialFoo>); // bool(true): class will accept any SpecialFoo |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Mapper<in SOURCETYPE, out TARGETTYPE> { | |
public static function map(SOURCETYPE $input): TARGETTYPE { ... } | |
} | |
class Foo {} | |
class SpecialFoo extends Foo {} | |
var_dump(new Mapper<Foo, Foo> instanceof Mapper<Foo, Foo>); // bool(true) | |
var_dump(new Mapper<Foo, Foo> instanceof Mapper<Foo, SpecialFoo>); // bool(false) incompatible TARGETTYPE | |
var_dump(new Mapper<Foo, Foo> instanceof Mapper<SpecialFoo, Foo>); // bool(true) | |
var_dump(new Mapper<Foo, Foo> instanceof Mapper<SpecialFoo, SpecialFoo>); // bool(false) incompatible TARGETTYPE | |
var_dump(new Mapper<Foo, SpecialFoo> instanceof Mapper<Foo, Foo>); // bool(true) | |
var_dump(new Mapper<Foo, SpecialFoo> instanceof Mapper<Foo, SpecialFoo>); // bool(true) | |
var_dump(new Mapper<Foo, SpecialFoo> instanceof Mapper<SpecialFoo, Foo>); // bool(true) | |
var_dump(new Mapper<Foo, SpecialFoo> instanceof Mapper<SpecialFoo, SpecialFoo>); // bool(true) | |
var_dump(new Mapper<SpecialFoo, Foo> instanceof Mapper<Foo, Foo>); // bool(false) incompatbile SOURCETYPE | |
var_dump(new Mapper<SpecialFoo, Foo> instanceof Mapper<Foo, SpecialFoo>); // bool(false) incompatible TARGETTYPE | |
var_dump(new Mapper<SpecialFoo, Foo> instanceof Mapper<SpecialFoo, Foo>); // bool(true) | |
var_dump(new Mapper<SpecialFoo, Foo> instanceof Mapper<SpecialFoo, SpecialFoo>); // bool(false) incompatible TARGETTYPE | |
var_dump(new Mapper<SpecialFoo, SpecialFoo> instanceof Mapper<Foo, Foo>); // bool(false) incompatbile SOURCETYPE | |
var_dump(new Mapper<SpecialFoo, SpecialFoo> instanceof Mapper<Foo, SpecialFoo>); // bool(false) incompatbile SOURCETYPE | |
var_dump(new Mapper<SpecialFoo, SpecialFoo> instanceof Mapper<SpecialFoo, Foo>); // bool(true) | |
var_dump(new Mapper<SpecialFoo, SpecialFoo> instanceof Mapper<SpecialFoo, SpecialFoo>); // bool(true) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment