Hi! >> class FooFactory { >> function create(Foo $foo): Foo { return $foo; } >> } >> >> class GooFactory extends FooFactory { >> function create(Goo $goo): Goo { return $goo; } >> } > OK HHVM allows it - we also allow it but trigger an E_STRICT error > @see http://3v4l.org/UhtOb
This is because this code has LSP violation - if you have an object about which you know it's typed as FooFactory, you should be able to call it with any Foo object. But if this object is a GooFactory instead, now not any Foo would serve, but only a subset of them - namely, Goo. This clearly violates the principle "everything good for the parent must be good for the child". Since PHP is a kind and nurturing language, we only produce E_STRICT, some other languages would refuse to accept such thing or interpret it as two different methods. See also: https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)#Covariant_method_argument_type -- Stas Malyshev smalys...@gmail.com -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php