2014-10-20 6 views
7

Mam klasę, która dziedziczy z nadklasy i gdzie nadklasa ma statyczną metodę find(), która tworzy wystąpienia instancji podklasa (aktywny wzór rekordu).W PHPStorm, w jaki sposób można utworzyć podpowiedź typu, gdy mam metodę nadklasy, która zwraca inny typ z każdej podklasy

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); 

W tej chwili docblock nie jest zbyt dobry do uzupełniania kodu i podpowiedzi do typu. Nie mogę używać nadklasy jako typu zwracanego, ponieważ podklasy mają różne metody z powodu kolumn DB.

W jaki sposób mogę wskazać PHPStorm, że metoda klasy nadrzędnej find() zwraca instancję podklasy, z której jest wywoływana, aby działanie kodu zakończyło się?

+0

Użyj '@ method' w swoim' ModelClass', aby ponownie zadeklarować macierzystą metodę 'find()' z wymaganym podpisem. – LazyOne

Odpowiedz

8

Znaleziono go:

class ActiveRecordClass { 

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

Wydaje się, że @return self vs @return static działa w ten sam sposób, w jaki można się spodziewać biorąc pod uwagę co słowa kluczowe normalnie. @return self nie wykrył metod dostępnych w podklasie konkretnej, ale @return static powoduje, że autouzupełnianie działa świetnie.

+0

możesz pokazać link do dokumentacji? Nie znalazłem 'static' na http: //www.phpdoc.org/docs/latest/references/phpdoc/types.html –

+0

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

+3

Próbowałem tej sztuczki na PHPStorm 8 - to nie działa (( –

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

jak ten - ustaw zmienną typu z PHPDoc

także http://phpdoc.org/docs/latest/references/phpdoc/types.html powiedzieć, że można korzystać z „ja” jako typ powrotu wartość

13 siebie, element, do którego ten typ dotyczy tej samej klasy, lub któregokolwiek z jej elementów podrzędnych, w którym znajduje się udokumentowany element z oryginalną wersją .

Na przykład

Metoda C() znajduje się w klasie A. bloku dokumentacyjnym, że jej wartość powrotna jest zaworem. Jako taka metoda C() zwraca instancję klasy A. Może to prowadzić do mylących sytuacji, gdy dziedziczenie jest zaangażowane w dziedziczenie .

na przykład (z poprzedniego przykładu Sytuacja taka ma zastosowanie)

Klasa B rozciąga klasy A i nie jest ponownie zdefiniować Metoda C(). Jako taki, można wywołać metodę C() z klasy B. W tej sytuacji może powstać niejasność, ponieważ samo może być interpretowane jako klasa A lub B. W tych przypadkach samo MUSI być interpretowane jako instancja obiektu Klasa, w której zapisano DocBlock zawierający typ self lub dowolną z jego klas potomnych.

W powyższych przykładach własny musi zawsze odnoszą się do klasy A lub B, ponieważ określa się metodą C (z) z klasy A

Jeśli Metoda C() znajdował się na nowo w klasie B, w tym definicja typu w DocBlock, a następnie self odnosi się do klasy B lub dowolnego z jej potomków z klasy B lub dowolnego z .

więc spróbuj

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

Dzięki. Brzmi idealnie, ale nie działa z funkcją @return. Najlepszą sugestią jest to, co robiłem do tej pory, ale jest to trochę pracochłonne i miałem nadzieję, że właśnie zdefiniuję typ zwrotu :( –

+0

wygląda na to, że phpDoc nie obsługuje późnego wiązania statycznego. (W moim przypadku zrozu ma wynik jako ActiveRecordClass) Więc możesz użyć innej zdolności/** * @var B $ b */ $ b = B :: find(); –