One more Liskov Subs. and parameter checking notice
| From: | jpauli | Date: | Tue, 06 Dec 2011 13:54:17 +0000 |
| Subject: | One more Liskov Subs. and parameter checking notice | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-56801@lists.php.net to get a copy of this message | ||
Greetings PHP Intern@ls :)
There is a PHP behavior I disagree with regarding OO model.
It's been here for a long time (5.0 ??, at least 5.2, 5.3 and 5.4) , here
it is :
<?php
interface Iface1 { }
interface Iface2 extends Iface1 { }
class Foo {
public function bar(Iface1 $arg) { }
}
class Foo2 extends Foo {
public function bar(Iface2 $arg) { }
}
?>
Strict Standards: Declaration of Foo2::bar() should be compatible with that
of Foo::bar()
I find this wrong.
Liskov (and the error message) says we must stay "compatible" in our
inheritence.
The fact is that we are in the code above :
- A uses IfaceA
- B extends A
- B should be able to overwrite A's method typing their IfaceA params on
IfaceB, if IfaceB extends IfaceA (and is thus compatible with it).
Thoughts ?
Julien.Pauli