Доброго времени суток! Работаю на PHP 7.4 с помощью phpstorm. Очень нравится использовать контроль типов. Очень нравится, что phpstorm отслеживает типы и даёт подсказки по свойствам/методам объектов. Но если у класса свойство - массив объектов, то подсказки не работают - phpstorm не отслеживает тип. Подробнее. Допустим объект класса "Фура", который может перевозить объекты класса "Груз". Хочу по очереди получать этот груз. Код (Text): <?php class Cargo // груз { protected int $id; protected string $name; } class Truck // Фура (грузовик) { protected array $cargoList = []; // перевозимые грузы public function addCargo(Cargo $cargo): void { $this-cargoList[] = $cargo; } public function getCargoList(): array { return $this->cargoList; } } // основная часть программы // грузовик $truck = new Truck(); // в $truck как-то попадают грузы // перебор грузов для грузовика foreach($truck->getCargoList() as $cargo) { // $cargo неизвестного типа // phpstorm подсказки не ставит } Пробовал использовать генераторы. Генераторы тоже не могут указывать тип возвращаемой переменной. Код (Text): class Truck { protected array $cargoList = []; // перевозимые грузы public function addCargo(Cargo $cargo): void { $this-cargoList[] = $cargo; } public function getNextCargo(): Generator { foreach ($this->cargoList as $cargo) { yield $cargo; } } } // основная часть программы // перебор грузов для грузовика foreach($truck->getNextCargo() as $cargo) { // $cargo неизвестного типа // phpstorm подсказки не ставит } Я решил проблему перебором идентификаторов, и дополнительным методом получения по идентификатору: Код (Text): class Truck { protected array $cargoList = []; // перевозимые грузы public function addCargo(Cargo $cargo): void { $this-cargoList[] = $cargo; } public function getIdCargoList(): array { return array_keys($this->cargoList); } public function getCargoById(int $id): Cargo { return $this->cargoList[$id]; } } // основная часть программы // перебор грузов для грузовика foreach($truck->getIdCargoList() as $cargoId) { $cargo = $truck->getCargoById($cargoId); // $cargo типа Cargo // подсказки phpstorm работают } Но мне не нравится использовать дополнительный метод. Как вариант обдумывал ещё для свойства $cargoList вместо массива использовать дополнительный класс, но совсем громоздко получается. Господа профессионалы, кто пользуется phpstorm, как можно из объекта получать элементы массива/списка/коллекции, понятного для phpstorm типа?
PHP: /** * @return array|Cargo[] */ public function getIdCargoList(): array { return array_keys($this->cargoList); }
PHPStorm поймёт такую анотацию: @return array<Cargo> --- Добавлено --- Если некий класс реализует интерфейс ArrayAccess, как например Collection а Laravel, то к нему тоже можно применять такой трюк: @return Collection<Cargo> Пока это только подсказки на уровне DocBlock, но PHP уверенно движется в сторону бОльшей типизации, так что когда-нибудь сможем писать буквально func(): Cargo[] или использовать дженерики. --- Добавлено --- @Elkaz ты так давно не был на форуме, у тебя подпись протухла.