Czy phpstorm potrafi rozpoznać typ przy iteracji kolekcji?

0

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

/**
 * @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.

$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:

/** @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>?

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 ...

1

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

0

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

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

$something jest poprawnie tooltipowane jako obiekt klasy Animal.

1 użytkowników online, w tym zalogowanych: 0, gości: 1