Попробую объяснить) Есть у меня два класса. Оба User.
1. У которого есть конструктор, свойства name, age, email и минимальный функционал по модификации этих свойств (сеттеры). Работает только с классом коллекций или доп. классами. Сам по себе ни о чем.
2. Класс User, в который надо передать класс БД. Методы работы с записями пользователей: создание, редактирование, удаление и вывод множества объектов.
По логике, первый класс - натуральное ООП.
Второй, это что-то из серии функционального программирования, где все основные методы, это просто хорошо сгруппированные функции, отвечающие за логику user в базе. При этом он завершён, то есть полностью самостоятелен.
Ну если совсем образно, то так (удалил ненужное)
1.
class User
{
public $name;
public $age;
public $email;
public function __construct(string $name, string $age, string $email){
$this->name = $name;
$this->age = $age;
$this->email = $email;
}
}
2.
class User
{
public $db;
public function __construct(PDO $db){
$this->db = $db;
}
public function create(array $data){
//INSERT INTO users
}
public function update(array $data){
}
public function delete(int $id){
}
}
1) Это Entity/Сущность, класс описывающий самого пользователя.
2) Это Repository/Репозиторий, класс для взаимодействия этих самых сущностей с хранилищем.
Другое дело что во втором случае, репозиторию хорошо бы уметь работать с объектами, а не их представлениями в виде массива.
class User{
public $id;
public $name;
public function setId($id){
$this->id = $id;
}
public function setName($name){
$this->name = $name;
}
}
class UserRepository
{
public $db;
public $user;
public function __construct(PDO $db){
$this->db = $db;
}
public function save(User $user){
if(empty($this->user->id)){
$this->db->prepare("INSERT INTO `users` (`name`) VALUE (?)");
$this->db->execute($this->user->name);
}else{
$this->db->prepare("UPDATE `users` SET `name` = ? WHERE `id` = ?");
$this->db->execute($this->user->name, $this->user->id);
}
}
public function delete(int $id){
//del
}
}