[PHP5] Probleme mit Interface + Vererbung
-
Morgen zusammen!
Ich beginne grade an meinen OOP- und an meinen PHP-Kenntnissen zu zweifeln.
Gegeben sind die folgenden Klassen und Interfaces:
1. Interface "Traversable" ist intern in der SPL leer definiert. Alle Objekte, die "Traversable" implementieren, können per Def. mittels foreach() oder each() iteriert werden.
2. Interface "IteratorAggregate" kommt ebenfalls aus der SPL und schreibt soweit ich sehen konnte nur die Methode "getIterator" ohne Parameter vor. "IteratorAggregate" erbt von "Traversable".
3. Interface "Iterator" stammt auch aus der SPL und schreibt gegenwärtig die Methoden "next","rewind","valid","current" und "key" vor. "Iterator" muss vom Rückgabewert von "getIterator" aus "IteratorAggregate" implementiert werden.
Dazu hab ich die folgenden Klassen und Interfaces definiert:
1. Interface "DocumentComponent" schreibt die folgenden Methoden vor:
- setConfig(DocumentConfiguration &config) \- setErrorHandler(DocumentErrorHandler &eHandler)
- getContent()
- getLastModificationTime()2. Die Klasse "SimpleDataContainer", welche "Iterator" und "IteratorAggregate" implementiert (und damit natürlich auch "Traversable"). Hinzu kommen noch ein paar weitere Methoden, die aber weder namentlich noch inhaltlich relevant sind.
3. Die Klasse "DocumentContainer", welche von "SimpleDataContainer" erbt und "DocumentComponent" implementiert, wobei aber von "SimpleDataContainer" nur Methoden genutzt werden, aber keine überschrieben wird.
Lasse ich nun "DocumentContainer" aus dem Spiel, so funktioniert das ganze auch einwandfrei, sprich alles macht in allen Testfällen seinen Job ohne Fehlermeldungen, Notices und Warnings.
Die Probleme ergeben sich erst, wenn ich versuche, die Datei mit "DocumentContainer" zu includen. Dann erhalte ich nämlich die prägnante Fehlermeldung "Fatal error: Class DocumentContainer could not implement interface IteratorAggregate in Unknown on line 0". Nun suche ich nach der Ursache für das ganze, sehe aber absolut nichts, was sich da ins Gehege kommen könnte. Nirgendwo wird "getIterator" auch nur angefasst, oder gar umdefiniert. Die Methode gibts nur einmal, und zwar in "SimpleDataContainer", wo sie wie gesagt auch einwandfrei akzeptiert wird.
Soweit so gut, erfahrungsgemäß ist PHP5 ja bei weitem nicht bug-frei, also hab ich natürlich mittels Testcase auch dahingehend meine Fühler ausgestreckt, habe das Problem aber leider nicht reproduzieren können. Zuerst aufgetreten ist das ganze auf einem CVS-Build von Anfang April, also hab ich vorsichtshalber nochmal einen aktuellen Build von gestern getestet, aber auch da tritt das selbe Problem auf, so das ich einen behobenen Bug ausschließen kann.
Die zentrale Frage ist also, in welchen Fällen eine Klasse ein Interface nicht implementieren kann, wenn aber gleichzeitig eine Klase, von der diese erbt, genau dieses Interface perfekt implementiert. Habt Ihr irgendwelche Ideen, Ansätze oder Vorschläge?
Gruß Jens