On 17 September 2014 15:52, Christian Stoller <stol...@leonex.de> wrote: > Hello all, > > I hope the subject is not misleading. Please look at the following code: > > <?php > class A { } > > class B extends A { } > > interface C { > function foo(A $a); > } > > class D implements C { > public function foo(B $b) { > > } > } > > This code produces a "Fatal error: Declaration of D::foo() must be > compatible with C::foo(A $a) in /xyz/inheritance.php on line 10" > (see http://3v4l.org/l2M0f). > > I don't get the reason for that behavior (and I could not find any > documentation about that, at least not at > http://php.net/manual/en/language.oop5.typehinting.php). > > I have already found https://bugs.php.net/bug.php?id=42330 but Derick's > response does not help me and the linked file cannot be accessed > anymore. > > I'd say that it is absolutely legal to define a more specialized > type in a child or implementing class, or would this have any bad > side effects? > > Thanks and best regards > Christian
Interesting that you bring this up today, I was literally talking to NikiC about this yesterday. This is what is called a covariant method argument type, and the reason that it is invalid is because if you pass an instance of D, to function that allows anything implementing C, then it would be acceptable to call foo() with an instance of A. The relevant article on wikipedia: https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)#Covariant_method_argument_type -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php