Czy phpstorm potrafi rozpoznać typ przy iteracji kolekcji?

Czy phpstorm potrafi rozpoznać typ przy iteracji kolekcji?
DE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1788
0

Metoda $genus->getNotes() zwraca ArrayCollection z elementami typu GenusNote. Wygląda ona tak:

Kopiuj
/**
 * @return ArrayCollection|GenusNote[]
 */
public function getNotes()
{
    return $this->notes;
}

Dzięki adnotacjom przy wywołaniu metody $genus->getNotes() phpstorm podpowiada mi metody ArrayCollection, a przy iteracji GenusNote. Niestety jeżeli użyję metody np. filter, to phpstorm już się gubi i przy iteracji nie podpowiada metod typu GenusNote.

Kopiuj
$notesCollection = $genus->getNotes()->filter(function(GenusNote $note) {
    return $note->getCreatedAt() > new \DateTime('-3 months');
});

$notes = [];
foreach ($notesCollection as $note) {
    // brak podpowiedzi
    $notes[] = [
        'id' => $note->getId(),
        'username' => $note->getUsername(),
        'avatarUri' => '/images/' . $note->getUserAvatarFilename(),
        'note' => $note->getNote(),
        'date' => $note->getCreatedAt()->format('M d, Y')
    ];
}

Rozwiązaniem jest wygenerowanie adnotacji - które jest stosunkowo szybkie, bo alt +enter na zmiennej kolekcji - i podanie typu:

Kopiuj
/** @var GenusNote[] $notesCollection */
$notesCollection = $genus->getNotes()->filter(function(GenusNote $note) {
    return $note->getCreatedAt() > new \DateTime('-3 months');
});

Dzięki temu w foreachu mamy podpowiedzi i wszystko gra :) Czy znacie jakiś sposób, który pozwoli osiągnąć coś takiego bez dodatkowych adnotacji, coś w stylu ArrayCollection<GenusNote>?

dzek69
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
0

Ależ ironiczna stopka, patrząc na post ;)

Niestety, też mnie irytuje/irytowało to w PhpStormie, ale lepszych podpowiedzi i tak chyba nie uświadczysz. Tutaj przykład jest taki, że powinno działać bez problemu, więc po prostu załóż im buga, poczekaj aż dopną duplikat :P i czekaj ...

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Nie wystarczyłoby do metody filter dodać PHPDoc @return $this? :P

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0

Ja używam tego plugina, działa całkiem fajnie.
https://github.com/pbyrne84/DynamicReturnTypePlugin

Kopiuj
function returnParameter($object) {
    return $object; // tak na prawdę tu jest jakaś logika
}
Kopiuj
$animal = new Animal();
$something = returnParameter($animal);

$something jest poprawnie tooltipowane jako obiekt klasy Animal.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.