flapflapjack
@flapflapjack
на треть я прав

Как корректно описать PHP класс?

Всем привет.

Как более правильно будет сделать модель для работы, например, с юзерами?

Вариант 1:
class Users {
protected $user_id;

public function by_id($id)
{
$this->user_id=$id;
return $this;
}

public function is_exist()
{
/*
$exist = здесь кусок кода, который смотрит - есть ли в БД юзер с айдишником $this->user_id
*/
return $exist ? true : false;
}
}


В таком случае я могу проверить существует ли пользователь:
$user=new Users();
$exist=$user->by_id(1)->is_exist();


Вариант 2:

class Users {
protected $user_id;

public function by_id($id)
{
$this->user_id=$id;
return $this;
}

public function is_exist($id=false)
{
$id=$id ? $id : $this->user_id;
/*
$exist = здесь кусок кода, который смотрит - есть ли в БД юзер с айдишником $id
*/
return $exist ? true : false;
}
}


В таком случае я могу проверить существует ли пользователь уже двумя способами:
$user=new Users();
$exist=$user->is_exist(1);
$exist2=$user->by_id(1)->is_exist();


Вопрос в том, правильно ли составлять класс таким образом, что одно и то же действие может выполняться двумя путями?

Какой способ будет верный - тот, где метод получает аргумент напрямую, или сперва формируется модель в нужном мне виде, а потом извлекается нужное значение.

Я так же понимаю, что ответ может быть - "без разницы", но как делаете конкретно вы?
  • Вопрос задан
  • 136 просмотров
Решения вопроса 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
но потом мне стало совсем ничего не понятно - чего это у меня один и тот же класс будет всем подряд заниматься. Там и без того уже сборная солянка - и регистрация, и проверка текущих кукизов, а тут еще и ..

Именно в этом состоит разница между двумя основными архитектурами ORM - Active Record и Data Mapper.

Data Mapper разделяет работу с бд и бизнес-логику самого объекта. В итоге мы имеем два объекта - UserMapper и User. UserMapper занимается общением с базой - ищет в БД и возвращает инстанс объекта User, обновляет данные в БД, удаляет строку из БД. Класс же User реализует только бизнес-логику, ничего не зная о том, как его данные хранятся в БД.

Active Record же держит все в одном классе, то есть сам юзер ищет себя в базе, удаляет, и так далее.

Я думаю, сейчас настало время перейти к варианту Data Mapper.
Ответ написан
syamskoy
@syamskoy
class User {
  public static findById($id) {
    // Ищем в базе, и возвращаем как созданный объект:
    if ($dataFromDB) {
      return new self($dataFromDB);
      // Или что-то вроде того:
      $user = new self();
      $user->load($dataFromDB);
      return $user;
    }
    // Если не находим, то
    return null;
  }
}

Но лучше вместо своего велосипеда посмотреть на готовые ORM'ки и выбрать подходящую, раз с объектом из базы работаешь как с моделью.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
php666
@php666
PHP-макака
Безсмысленно давать тебе какие-либо советы, пока не прочитаешь эту книгу и, в частности, Часть I. и Часть II раздел под названием "Глава 10. Архитектурные типовые решения источников данных"
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект
30 апр. 2024, в 23:39
3000 руб./за проект