@phpcoder81

Как сделать вывод коллекции объектов?

class ProductCollection
{
  public $db;
  public $product;

  public function __construct(Product $product, DB $db)
  {
    $this->product = $product;
    $this->db = $db;
  }

  public function getAll():object
  {
    $data = [];
    
    foreach($this->db->getRows('SELECT `id`, `name`, `price` FROM `products`') as $v){
      
      //$product = new Product($v['id'], $v['name'], $v['price']); //вариант 1
      
      $product = new $this->product($v['id'], $v['name'], $v['price']); // вариант 2
	  
      $data[] = $product;
    }
    
    return (object)$data;
  }

}


$db = new DB;
$product = new Product;
$productCollection = new ProductCollection($product, $db);
var_dump($productCollection->getAll());


1. Не могу понять, надо ли добавлять в конструктор коллекции объект Product или лучше внутри инициализировать, как в закомментированном варианте 1?
2. Про вариант 2, странно, я уже создаю объект до передачи его в коллекцию, и потом еще внутри делаю new. Тут нет ошибки?
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Чет какая-то каша из топора и опилок...

1) Если это ProductCollection зачем туда передавать Product? Если бы это был просто Collection - это имело бы смысл.

2) Передавать DB в параметрах - такое себе, есть DI для такого, зачем этот мусор в конструкторе?

3) return (object)$data; вообще не айс, зачем было создавать массив, а потом его кастить? Создавайте сразу объект. Я вообще в данном случае не вижу смысла возвращать объект, верните массив и все, зачем эти касты? И зачем эти двойные присвоения?
$product = new $this->product($v['id'], $v['name'], $v['price']); // тут явная лажа с объявлением
$data[] = $product; // а тут явно лишний шаг, это можно было сделать строкой выше
4) new $this->product это вообще как??? У вас там не строка вроде, а объект...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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