Re: inheritance check too strict?

From: Date: Thu, 19 Aug 2010 19:33:19 +0000
Subject: Re: inheritance check too strict?
References: 1 2 3 4 5 6 7 8  Groups: php.internals 
Request: Send a blank email to internals+get-49468@lists.php.net to get a copy of this message
Zeev Suraski wrote:
At 17:04 19/08/2010, Ionut G. Stan wrote:
I can't call Child::foo() with an instance of Taz, but I can call Parent::foo() with such an instance. So, I can't use instances of Child wherever instances of Parent would be accepted.
Child should clearly not be allowed to inherit Parent in the code above, since the signature of Child::foo() is more restrictive than the signature of Parent::foo(). The other way around could work (although I don't recall if we allow it): class Foo {} class Bar extends Foo {} class Parent {
        public function foo(Bar $bar){}
} class Child extends Parent {
        public function foo(Foo $foo){}
} No issues here - since any Bar object is also a Foo object and would pass the is_a validation of Foo. Again, I don't recall if we allow such signature overrides or not. Zeev
Guys, this is going a bit nuts, let's swap all the Foo and Bar's for a real example - Zeev I've copied the way you specified above. class Point2D { // Foo public $x; public $y; } class Point3D extends Point2D { // Bar extends Foo public $z; } class Point2DManager { // Parent public function distanceBetween( Point3D $p1 , Point3D $p2 ) {}; } class Point3DManager extends Point2DManager { // Child extends Parent public function distanceBetween( Point2D $p1 , Point2D $p2 ) {}; } You're saying that makes sense and is no problem? honestly? Best, Nathan ps: no offence / nothing personal just want to get this cleared up

« previous php.internals (#49468) next »