2012-05-22 6 views
17

Używam IDE PHPStorm i wpadam w kłopoty, gdy przeprowadzam inspekcję kodu.PHPStorm: poprawny PHPDoc dla kolekcji obiektów?

Mam metodę, która zwraca kolekcję obiektów. Sam Collection jest obiektem, który ma swoje własne metody i implementuje interfejs Traversable:

class Repository 
{ 
    public function findByCustomer(Customer $user) 
    { 
     // ... 
     return new Collection($orders); 
    } 
} 

Gdybym dokumentowania findByUser() zwrócić Collection, inspekcja kodu rozumie metody na tym obiekcie, ale nie robi” t zrozumieć, co sprzeciwia kolekcja zawiera:

/** 
* @return Collection 
*/ 
public function findByCustomer() { ... } 

Method getTotal() not found in class Collection

Gdybym udokumentować findByUser() wrócić zbiór Order obiektów, inspekcja kodu teraz rozumie, co jest w środku zbioru, ale nie metody na Collection samego:

/** 
* @return Order[] 
*/ 
public function findByCustomer() { ... } 

Method slice() not found in class Order[]

Czy istnieje sposób, aby określić zarówno w tym samym czasie, coś w stylu składni Java?

/** 
* @return Collection<Order> 
*/ 
public function findByCustomer() { ... } 
+2

Można łączyć je (oba typy) razem. Może nie być idealny w niektórych sytuacjach, ale działa i możesz go uznać za lepszy niż ręczne określanie typu za pomocą @var komentarza PHPDoc. Więc ... '/ ** @return Collection | Zamów [] * /' – LazyOne

+0

@LazyOne: nawet jeśli nie jest idealny, jest to dla mnie czystsza opcja. Czy możesz dodać to jako odpowiedź? – Benjamin

Odpowiedz

26

Można łączyć je (oba typy) razem. Może nie być idealny w niektórych sytuacjach, ale działa i można go uznać za lepszy niż ręczne określanie typu za pomocą komentarza PHPDoc @var.

/** @return Collection|Order[] */ 
+0

W takim przypadku może nawet odczytać: return Collection, co można uznać za tablicę Order. – programaths

+0

Niestety to już nie działa w PHPStorm 8: teraz sprawdza, czy oba typy rozdzielone przez '|' mają tę metodę. Czy istnieje lepszy sposób na wpisanie tego podpowiedzi teraz? – Benjamin

+0

@Benjamin Proszę podać prosty przykład kodu do skopiowania i wklejenia (chciałbym zobaczyć go głębiej) – LazyOne