Пользовательский класс, хороший подход? - PullRequest
2 голосов
/ 07 января 2011

Я создаю пользовательский класс, который управляет созданием, удалением и модификацией универсального пользователя.Мой класс должен использоваться следующим образом:

# creation
user::create($username, $password, $email); // Does not need of $id

# modification
$u = new user($id);
$u->edit('password', $new_password);

# deletion
$u->delete();

В основном класс содержит статический метод create (), который, очевидно, не требует использования идентификатора в качестве аргумента.После создания вы можете собрать пользовательскую информацию и управлять пользователем, создавая экземпляр класса user, и установить в качестве аргумента $ id пользователя.Это хороший дизайн, или я должен создать что-то вроде:

# creation
$users = new genericUserMethod();
$users->create($username, $password, $email);

# modification
$u = new specificUser($id);
$u->edit('password', $new_password);

# deletion
$u->delete();

... Создание 2 разных классов.Или есть другой способ?

Ответы [ 3 ]

3 голосов
/ 07 января 2011

Это может быть подход:

class User {
    private $id;
    private $name;
    //more fields here

    public function __construct($id = null) {
        $this->id = $id;
        if(!is_null($this->id)) {
            $this->load_user_data();
        }
    }

    protected function load_user_data() {
        //select from DB where id = $this->id and populate fields
    }

    public function save() {
        //if $this->id is null insert the user details in DB and populate $this->id with new user's id
        //else update DB with field (optionally check what has changed and update only if necessary)
    }

    public function delete() {
        //delete user if $this->id is not null
    }

    //fields getters and setters here as needed

}

Образец использования:

$mary = new User(); //fresh new user
echo $mary->getId(); //returns null as this user is not inserted.
$mary->setName('mary');
$mary->save(); //insert user with name mary in the DB
echo $mary->getId(); // returns an id as this user is now inserted

$john = new User(2); // we assume there was a user john in DB with id = 2
echo $john->getName(); //echoes 'john' if this was his name in DB

Вы даже можете определить статические методы в классе, например getActiveUsers(), который возвращает массив с активными пользователями, например ...

Примечание: Это предназначено для довольно простых нужд, в случае, если вам требуется делать сложные вещи купола, я бы рекомендовал вам использовать библиотеку ORM, как указано

3 голосов
/ 07 января 2011

Два популярных способа справиться с этим: Active Record и Data mapper . Doctrine 1 использовал шаблон активной записи, а Doctrine 2 использует Data Mapper.Вкратце:
- с активной записью у вас есть класс, который обрабатывает как данные, так и постоянство
- с Data Mapper у вас есть класс данных и класс, который обрабатывает персистентность

Также имеется Объект доступа к данным шаблон, который может идти поверх любого из упомянутых выше.

Ваш первый пример выглядит как шаблон активной записи с необоснованным статическим сокращением для создания объекта записи (почему бы не иметь несколько конструкторов или необязательный id - null для нового, целое для существующего).

Второй пример выглядит как DAO поверх активной записи и выглядит более привычно.

2 голосов
/ 07 января 2011

Первый. Возможно, вам стоит взглянуть на ActiveRecord / ActiveModel для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...