Skip to content

Instantly share code, notes, and snippets.

@IMSoP
Last active March 17, 2021 21:56
Show Gist options
  • Save IMSoP/bec95b177e8ae297983984db94ba99ef to your computer and use it in GitHub Desktop.
Save IMSoP/bec95b177e8ae297983984db94ba99ef to your computer and use it in GitHub Desktop.
<?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
<?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