phpbar.de logo

Mailinglisten-Archive

[php] PHP 5: Polymorphie - wo bist du?

[php] PHP 5: Polymorphie - wo bist du?

Martin Adler adler.martin at web.de
Don Aug 21 16:12:16 CEST 2008


Macht durchaus sinn in meinen Augen.
Denn durch deine Definition:
abstract class B implements A {
    public function foo(B $obj) {
    }
}

wird B incompatibel zum Interface A.

Sprich, durch das einbinden des Interface von A verpflichtest du dich, 
dass $b->foo($a) funktionieren muss.
Deine Deklaration spezifiziert jedoch eine Untermenge 
(Spezialisierungen) und steht somit im Widerspruch zum interface.

g,
Martin

Hannes H. wrote:
> Hallo Leute,
> 
> folgendes Beispiel:
> 
> <?php
> interface A {
>    public function foo(A $obj);
> }
> 
> abstract class B implements A {
>    public function foo(A $obj) {
>    }
> }
> 
> class C extends B {}
> 
> $c = new C();
> ?>
> 
> ($c instanceof A) ==> true
> ($c instanceof B) ==> true
> ($c instanceof C) ==> true
> 
> Soweit alles klar - aber nun mein Problem:
> 
> Warum liefert
> 
> abstract class B implements A {
>    public function foo(B $obj) {
>    }
> }
> 
> die Fehlermeldung "Fatal error: Declaration of B::foo() must be
> compatible with that of A::foo()"?
> 
> B ist doch sehrwohl auch vom Typ A, also hab ich das Interface korrekt
> implementiert - zumindest nach meinem Verständnis der OOP.
> 
> Ist das schon einmal jemandem aufgefallen? Ist das ein Fehler oder ein
> Feature? Wenn zweiteres - was für Sinn soll das machen ?!
> 
> Liebe Grüße
> Hannes Halenka

php::bar PHP Wiki   -   Listenarchive