Hi,

On Tue, Dec 6, 2011 at 14:54, jpauli <jpa...@php.net> wrote:

> 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 ?
>

No, that makes B incompatible with A.

Consider calling $obj->bar($obj) where obj implements IFaceA and not
IfaceB, if $obj is of class A, this is ok, if $obj is of class B, this is
invalid.

In other terms, arguments' types should be contra-variant. Currently PHP
expects them to be invariant, but there is already an RFC discussing how to
extend it:

https://wiki.php.net/rfc/prototype_checks

Best,


>
> Julien.Pauli
>



-- 
Etienne Kneuss
http://www.colder.ch

Reply via email to