сеттеры?
https://imgur.com/8umDlr4
Посмотри @template-implements @template-extends Кажется, первое как раз для тебя.
<?php /** * @template T */ interface IFoo {} /** * @implements IFoo<int> */ class Foo implements IFoo {} https://psalm.dev/docs/annotating_code/templated_annotations/
Для setValue нельзя будет поменять тип в реализации
Ты можешь указывать это для отдельных переменных/методов. Не обязательно для целого класса
interface IFoo { public function setValue(mixed $value) : void; } class Foo implements IFoo { public function setValue(int $value) : void{ } }
https://psalm.dev/r/92d23c6edf
Но когда вы такое используете, то желательно, чтобы весь проект был покрыт типами и был включён псалм. Иначе действительно будут проблемы с тем, что реализация может не соответствовать контракту (т.к. пхп без псалма не смотрит на уточнение дженерика)
+ такое можно и без методов реализовать (указать для проперти в абстрактом классе, но я скорее за интерфейсы)
А как такое сделать через abstract class? phpstan выводит ошибки при попытке использовать его в list<ClassName>
Обсуждают сегодня