Правила
...
5. Категорически запрещается размещать на страницах Сервиса:
...
5.12. Задачи и задания. В отличие от вопроса, задача и задание представляют собой частную проблемную ситуацию с явно заданной целью, которую необходимо достичь. Пользу от достижения этой цели получает, как правило, лишь её автор. И даже автору решение задачи или задания будет полезно лишь кратковременно (до тех пор, пока он не использует полученное решение). Все остальные пользователи, которые будут просматривать вопрос, сведенный к решению частной задачи, в надежде найти ответ на свой, лишь понапрасну затратят время. Поэтому, чтобы такие вопросы-задания не мешали другим пользователям искать ответы на вопросы, нам приходится их удалять. А для поиска помощи в решении задач и выполнения заданий мы рекомендуем использовать специализированные сервисы, например «Хабр Фриланс».
curl_setopt($ch, CURLOPT_VERBOSE, true); curl_error($ch);
Dependency Injection, собственно в более простом случае можно использовать Registry паттерн, хотя это более "текучая" конструкция, но для упрощенной схемы подойдет.
new Product($v['id'], $v['name'], $v['price']); - очень кривовато, либо хотя бы массив передайте в формате ключ-значение, либо дата трансфер обжект. Для начала подойдет массив, и я бы инициализацию вынес из конструктора во внутренний метод, типа $product->initByArray($dataArray);