В чем отличие возвращаемого массива от объектов?

Ребят, помогите понять, какая разница в возвращаемом результате.
Для чего, в данном случае, возвращать объекты? Чем мне это поможет на конкретном примере?
Хочу разобраться окончательно)

1. Получаем массив
class Product
{
  public $data = [];

  public function getAll(){

    foreach(range(0, 10) as $v){
      $this->data[$v]['id'] = $v;
      $this->data[$v]['name'] = 'Name';
      $this->data[$v]['price'] = rand(100, 500);
    }

    return $this->data;
  }
}

$a = new Product();
var_dump($a->getAll());


2. получаем коллекцию объектов
class Product
{
  public $id;
  public $name;
  public $price;

  public function __construct(int $id, string $name, int $price){
    $this->id = $id;
    $this->name = $name;
    $this->price = $price;
  }
}

class ProductCollection
{
  public $data = [];

  public function getAll(){

    foreach(range(0, 10) as $v){
      $this->data[] = new Product($v, 'Name', rand(100, 500));
    }

    return $this->data;
  }
}

$b = new ProductCollection();
var_dump($b->getAll());
  • Вопрос задан
  • 1406 просмотров
Решения вопроса 2
php666
@php666
PHP-макака
Для чего, в данном случае, возвращать объекты?
Твой вопрос говорит о том, что ты не понимаешь разницу между объектом и массивом.

Это не одно и тоже.
Объект - это не просто хранилище данных, как массив.
Объект - это описание некой сущности, представление этой сущности в рамках языка программирования. Объект может иметь свойства и методы, оперирующие этими свойствами или методы, делающие еще что-либо, что касается непосредственно этого объекта.

Прочти хот-бы пол книги "Гради Буч - Объектно-ориентированный анализ и проектирование". И ты перестанешь задавать эти детские вопросы.

Чем мне это поможет на конкретном примере?
ОК. Пример. Давай допустим, что твой объект 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
Ответ написан
mad_maximus
@mad_maximus
С коллекциями удобнее работать. Вы вот вспомните, что у вас в массиве, не заглядывая в код? А объект сам скажет, что у него внутри за счет публичных методов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Немного опыта и больших проектов - и понимание, чем
function f(array &arr)
хуже, чем
function f(KnownObject o)
станет простым и естественным.
Тем более, что даже в простых проектах можно долго искать причину, по которой не работает
echo $arr['namе'];
Сомневающимся предлагаю определить, в чем проблема последнего примера.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы