Angenommen wir folgende Vererbungskette in PHPVerschmälerung Rückgabetyp auf Vererbung für abstrakte Methode durch PHPDoc verursacht PHP-Fehler
abstract class Entity {}
abstract class RealEntity extends Entity {}
abstract class PseudoEntity extends Entity {}
und eine Reihe von anderen Klassen, die die gleiche Vererbungskette
abstract class EntitySerializer {
/**
* @return Entity
*/
abstract public function getEntity();
}
abstract class RealEntitySerializer extends EntitySerializer {
/**
* @return RealEntity
*/
abstract public function getEntity();
}
abstract class PseudoEntitySerializer extends EntitySerializer {
/**
* @return PseudoEntity
*/
abstract public function getEntity();
}
Spiegel
PHP beschwert sich, dass die abstrakte Methode getEntity
entweder richtig implementiert werden muss (und das abstract
Schlüsselwort verlieren) oder nicht neu deklariert werden muss. Ich kann verstehen, warum sich PHP beschwert, denn trotz der PHPdoc-Kommentare ist die Methodensignatur identisch mit der Signatur der übergeordneten Methode in EntitySerializer
.
Allerdings mag ich irgendwie klar machen, dass Kind-Klassen, die RealEntitySerializer
oder PseudoEntitySerializer
verlängern muß keine Instanz einer beliebigen Entity
zurück, aber die Rückkehr Typ RealEntity
oder PseudoEntity
bzw. verengen.
Besonders, wenn ich Neudefinition des Verfahrens und der entsprechende PHPDoc aus den Zwischenklassen, um weglassen PHP glücklich zu machen, mein IDE geht davon aus, dass richtig RealEntitySerializer::getEntity
und PseudoEntitySerializer::getEntity
dürfen eine beliebige Instanz von Entity
zurückzukehren. Folglich beklagt sich meine IDE, dass ich undefined Methoden aufrufen, wenn ich Methoden aufrufen, die für eine der Zwischenklassen auf einem Objekt spezifisch sind, das von RealEntitySerializer::getEntity
oder PseudoEntitySerializer::getEntity
resp.
Wie erreiche ich beide Ziele? Code, der (a) von PHP fehlerfrei interpretiert wird und (b) ordnungsgemäß dokumentiert ist.