Коллекции объектов

118
13 июня 2021, 00:00

Предисловие/вода

У меня в проекте методы классов часто возвращают массивы данных, например, список товаров.

В таком виде:

$products = [ 
   "product-1" => [...], 
   "product-2" => [...] 
];

При работе, начал сталкиваться с разными ошибками, неудобством работы с массивом и т.д., тем более, это не соответствует методологии OOП.

Первым делом я реализовал класс, ProductItem.

Теперь все проще. У меня массив объектов ProductItem.

И метод у меня выглядит таким образом:

// для примера
public function getProducts() : array {
    ...
    return [
       new ProductItem(...),
       new ProductItem(...),
    ];
}

Возвращаемый тип метода getProducts - массив.
Другим разработчикам не сразу понятно, что за массив? Вероятно, для решения проблемы нужно создать коллекцию объектов getProducts.

Вопрос Хотелось бы иметь возможность быстро создавать коллекции разных типов (коллекция не должна быть универсальной).

Минимальные требования к коллекции: Iterable и Countable.

Возможно, нужно создать абстрактную коллекцию, где будут реализованы Iterable и Countable интерфейсы, и описаны какие-то методы для работы с коллекцией (get, has, delete).

После чего, я бы смог создать свой класс ProductItemsCollection унаследовав от абстрактной коллекции.

И иметь готовую коллекцию объектов, в котором могли бы быть только классы типа getProducts, при попытке запихнуть другой объект - исключение.

Подскажите пожалуйста, может у кого-то есть готовые примеры, или кто-то поможет грамотно реализовать такое ?

Answer 1

Если уж Вы почувствовали необходимость воспользоваться библиотечными / шаблонными решениями в своей работе, то, может быть, сделаете еще один небольшой "шаг вперед" - воспользуетесь одним из распространенных фреймворков, в котором эти библиотеки уже имеются, и отпадет потребность "изобретать велосипед"? (Хотя лично я тот еще любитель велосипедить... :) ) Необходимая Вам коллекция имеется, например, в Laravel и в Symfony.

IMHO: Laravel имеет более низкий порог вхождения и более дружелюбен к изучению "с колес", по мере необходимости. Symfony же - это даже не "ящик с инструментами", это - огромная мастерская с кучей инструментов, станков и приспособлений, для правильного применения которых нужно уже достаточно много понимать и иметь опыт практического применения.

Answer 2

Другим разработчикам не сразу понятно, что за массив? Вероятно, для решения проблемы нужно создать коллекцию объектов getProducts.

Поскольку PHP язык слабо типизированный, то решении проблемы - это PHPDoc. Указать возвращаемый тип в комментарии:

/**
 * @return ProductItem[]
 */

Не вижу смысла в создании отдельного класса коллекции для каждой сущности.

READ ALSO
Фатальная ошибка Uncaught Error: Call to a member function fetch() php [дубликат]

Фатальная ошибка Uncaught Error: Call to a member function fetch() php [дубликат]

Всем доброго времени суток, недавно начал изучать php7 по учебнику, и я столкнулся с такой проблемой (Fatal error), и не могу понять, что же я сделал...

114
Проблема в размещении картинок рядом. PHP

Проблема в размещении картинок рядом. PHP

Нужно, что-бы логотипы были рядом друг с другом(шли в ряд)

88