2016-09-02 3 views
1

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.

Antwort

0

Sie möchten das PSR-5: PHPDoc@method Tag.

Syntax

@method [return type] [name]([type] [parameter], [...]) [description] 

Beispiele

/** 
* @method string getString() 
* @method void setInteger(int $integer) 
* @method setString(int $integer) 
*/ 
class Child extends Parent 
{ 
    <...> 
} 


abstract class EntitySerializer { 
    /** 
    * @return Entity 
    */ 
    abstract public function getEntity(); 
} 

/** 
* @method RealEntity getEntity() 
*/ 
abstract class RealEntitySerializer extends EntitySerializer {} 

/** 
* @method PseudoEntity getEntity() 
*/ 
abstract class PseudoEntitySerializer extends EntitySerializer {} 
Verwandte Themen