Mailinglisten-Archive |
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