Чет какая-то каша из топора и опилок...
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 это вообще как??? У вас там не строка вроде, а объект...