2014-10-20 7 views
7

Ich habe eine Klasse, die von einer Oberklasse geerbt und die Oberklasse hat eine statische find() Methode, die Instanzen von die Unterklasse (aktives Aufzeichnungsmuster).In PHPStorm, wie kann ich Typhinweis funktionieren, wenn ich eine Superklassenmethode habe, die einen anderen Typ aus jeder Unterklasse zurückgibt

class ActiveRecordClass { 

    /** 
    * @return mixed 
    */ 
    public static function find() { 
     // Code returns instance of called class 
    } 
} 

class ModelClass extends ActiveRecordClass { 

} 

// returns instance of ModelClass, but PHPStorm doesn't realise 
ModelClass::find($model_id); 

Im Moment ist der Docblock nicht sehr gut für Code-Vervollständigung und Typ-Hinting. Ich kann die Oberklasse nicht als Rückgabetyp verwenden, da die Unterklassen aufgrund von DB-Spalten unterschiedliche Methoden haben.

Wie kann ich PHPSstorm angeben, dass die Superklasse find() eine Instanz der Unterklasse zurückgibt, von der sie aufgerufen wird, damit die Codevervollständigung funktioniert?

+0

Verwenden Sie '@ method' in Ihrer' ModelClass', um die 'find() '- Methode der Eltern mit der gewünschten Signatur erneut zu deklarieren. – LazyOne

Antwort

8

es gefunden:

class ActiveRecordClass { 

    /** 
    * @return static 
    */ 
    public static function find() { 
     // Code returns instance of called class 
    } 
} 

Es scheint, dass @return self vs @return static die gleiche Art und Weise funktioniert, die Sie gegeben würde erwarten, was die Schlüsselwörter normalerweise tun. @return self nicht die Methoden auf der konkreten Unterklasse, aber @return static machen Autocomplete funktionieren großartig.

+0

können Sie Link zur Dokumentation anzeigen? Ich habe 'statisch' bei http gefunden: //www.phpdoc.org/docs/latest/references/phpdoc/types.html –

+0

@VasilVanchuk https://github.com/phpDocumentor/fig-standards/blob/master/proposed/phpdoc.md#keyword - # 14 ganz unten – LazyOne

+3

Ich habe diesen Trick bei PHPStorm 8 versucht - es funktioniert nicht (( –

0
/** 
* @var ModelClass 
**/ 
$model = ModelClass::find($model_id); 

wie die - set Variablentyp mit phpDoc

Auch http://phpdoc.org/docs/latest/references/phpdoc/types.html sagen, dass Sie 'Selbst' als Art von Wert zurück

13 selbst verwendet werden kann, wobei das Element dieser Art, auf die gilt, ist von der gleichen Klasse, oder eines seiner Kinder, als die das dokumentierte Element ursprünglich enthalten ist.

Zum Beispiel:

Methode C() der Klasse A enthalten ist Die DocBlock besagt, dass seine Rückgabewert vom Typ selbst ist. Als solche Methode gibt C() eine Instanz der Klasse A zurück. Dies kann zu verwirrenden Situationen führen, wenn die Vererbung involviert ist.

Beispiele (vorherige Beispiel Situation immer noch gilt):

Klasse B Klasse A erstreckt und neu zu definieren nicht Methode C(). Als solches ist es möglich, die Methode C() aus der Klasse B aufzurufen. In dieser Situation kann eine Ambiguität auftreten, da self entweder als Klasse A oder als B interpretiert werden kann. In diesen Fällen muß das self als eine Instanz der interpretiert werden Klasse, in der der DocBlock, der den Selbsttyp enthält, geschrieben ist oder eine der untergeordneten Klassen .

In den obigen Beispielen selbst muss immer in der Klasse A oder B beziehen, da es mit Verfahren C() der Klasse A definiert ist

Wenn Methode C() war in der Klasse B neu definiert werden, einschließlich Der Typ Definition in der DocBlock, dann würde sich selbst auf Klasse B oder eine der seiner Kinder beziehen. so

versuchen

/** 
* @return self 
*/ 
public static function find() { 
    // Code returns instance of called class 
} 
+0

Danke. Klingt perfekt, scheint aber nicht mit @return self zu funktionieren. Der oberste Vorschlag ist, was ich bisher gemacht habe, aber es ist ein wenig mühsam und ich hatte gehofft, nur den Rückgabetyp zu definieren :( –

+0

sieht aus wie phpDoc nicht unterstützt Late Static Binding. (In meinem Fall wird das Ergebnis als ActiveRecordClass interpretiert) So können Sie eine andere Fähigkeit verwenden/** * @var B $ b */ $ b = B :: find(); –

Verwandte Themen