В чем отличие возвращаемого массива от объектов?
Для чего, в данном случае, возвращать объекты?  Твой вопрос говорит о том, что ты не понимаешь разницу между объектом и массивом. 
Это не одно и тоже. 
Объект - это не просто хранилище данных, как массив.
Объект - это описание некой сущности, представление этой сущности в рамках языка программирования. Объект может иметь свойства и методы, оперирующие этими свойствами или методы, делающие еще что-либо, что касается непосредственно этого объекта. 
Прочти хот-бы пол книги "Гради Буч - Объектно-ориентированный анализ и проектирование". И ты перестанешь задавать эти детские вопросы.Чем мне это поможет на конкретном примере? ОК. Пример. Давай допустим, что твой объект Product не просто содержит свойства, а каждое свойство..... да - тоже является объеком. Итак, перепишем конструктор, добавим несколько свойств новых, для примера: public function __construct(int $id, string $name, int $price, $decription, $discount_date){
    $this->id = $id;
    $this->name = new EntityText($name);
    $this->price = new Price($price);
    $this->decription = new EntityText($decription);
    $this->discount_date = new MyDate($discount_date); // MyDate extends \Datetime
  }
Требование к одной из страниц магазина, показывающего продукт:  нужно отображать цену в RUB и в USD. Текст описания не должен быть более 200 символов. Показать дату окончания скидки в человеческом формате.<html>
 <div id="product<?=$obj->getId()?>">
  <h1><?=$obj->getName()->getTextValue()?></h1>
  <p>Цена: <?=$obj->getPrice()->getUSD()->asText()?></p> <!-- например, выведет "101 доллар США" (c правильной формой слова "доллар/доллара/долларов") -->
  <p><?=$obj->getDescription()->getTextValue(200)?></p>
  <p>Скидка действут <?=$obj->getDiscountDate()->formatAsHuman()?></p> <!-- выведет "еще 2 дня" -->
 </div>
</html>
Теперь вопрос: как это будет выглядеть на массивах? Разницу видишь?
и начинай читать отсюда-  https://dom-knig.com/read_210105-3
С коллекциями удобнее работать. Вы вот вспомните, что у вас в массиве, не заглядывая в код? А объект сам скажет, что у него внутри за счет публичных методов.