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();


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

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

Я так же понимаю, что ответ может быть - "без разницы", но как делаете конкретно вы?
  • Вопрос задан
  • 137 просмотров
Решения вопроса 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. Архитектурные типовые решения источников данных"
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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