https://sergeymukhin.com/blog/dzeneriki-v-php Хорошая статья о том, что такое дженерики и как с ними работать. Зачем они конкретно нужны? `* @phpstan-template TKey of array-key
- @phpstan-template T
- @template-extends ReadableCollection
- @template-extends ArrayAccess / interface Collection extends ReadableCollection, ArrayAccess { /*
- Adds an element at the end of the collection.
- @param mixed $element The element to add.
- @phpstan-param T $element
- @return void we will require a native return type declaration in 3.0 / public function add(mixed $element); Взглянем на определение коллекций доктрины. Базово, коллекция работает с mixed. Но стоит нам написать: `/*
- @var Collection */ private Collection $products; И сразу получаем кучу преимуществ:
- ide начинает правильно определять, с каким типом мы работаем в этих коллекциях
- phpstan начинает более качественно анализировать код К слову о phpstan, на 6 уровне проверок он начинает нас ОБЯЗЫВАТЬ определять типы в генериках. Это и плюс и минус одновременно. Например: class MyFieldType extends AbstractType{} Во время анализа получаем ошибку: Class MyFieldType extends generic class SymfonyComponentFormAbstractType but does not specify its types: TData Вот только, если перейти в сам класс - нет там дженериков. Хорошенько покопавшись, обнаруживаем что в symfony plugin для phpstan есть stub, в котором заявлен дженерик TData для методов getData, setData. Только вот в 90% случаев мы их никогда не будем вызывать. Приходится описывать его, либо заглушать через ignore.``