вопрос к гуру ООП: правильное использование объектов

Uprinter

Новичок
вопрос к гуру ООП: правильное использование объектов

В базе данных имеется таблица пользователей с обычным набором параметров (допустим, "имя", "возраст", "статус" и т.п.). Набор операций тоже обычный для веба: добавление, обновление, удаление, получение данных.

Вопрос: как правильнее реализовать и использовать класс user?

Возникли такие варианты:

PHP:
// 1.
// Создаем "пустого" юзера, а потом методам либо передаем id (если нужно, допустим, получить данные), либо данные  (если нужно обновить или создать нового юзера)
$user = new user;
$user_date = $user -> get_user_date($id); // получаем данные о пользователе
$user -> save("name", "age", "status"); // создаем нового юзера
$user -> update($id, "name", "age", "status"); // обновляем данные юзера

// 2.
// Сразу инициализируем юзера при создании объекта
$user = new user($id);
$user_date = $user -> get_user_date(); // получаем данные о пользователе
$user -> save("name", "age", "status"); // создаем нового юзера
$user -> update("name", "age", "status"); // обновляем данные юзера

// 3.
// Делаем нечто среднее
$user = new user;
$user -> init($id); //присваиваем свойствам объекта $user данные юзера $id

// при этом возможно использовать методы двумя способами:
$user -> get_user_date(); //получаем данные инициализированного пользователя
$user -> get_user_date($id); //получаем данные пользователя $id
Кто как делает? Поделитесь опытом!

Спасибо.
 

zarus

Хитрожопый макак
PHP:
class User {
  private $id = 0;
  $param1 = '';
  ...
  function __construct($id=0) {
    if ((!empty($id))  && ($res = mysql_query('SELECT `id`,.... FROM `user` WHERE `id`='.invtval($id))) && ($row = mysql_fetch_assoc($res))) {
      $this->id = $id;
      $this->param1 = $row[...];
    }
  }
  ...
}

$user = new User($id);
// В процедуре __construct анализируем передачу $id - если не пустое, то выбираем данные из БД, иначе инициализируем новую запись.
$user->save("name", "age", "status"); // Создаем нового юзера в БД
$user->update("name", "age", "status"); // Обновляем данные юзера в БД
$use->delete(); // Удаляем юзера из БД
 

Uprinter

Новичок
zarus, спасибо.
Хороший вариант. Я так тоже делал, но не очень понравилось. Работает нормально, но имеется какая-то двусмысленность...
 

JIeoH

Guest
Два кода одинаговы то у Uprinter упрощёнее с миносом, что паметь у баузера жрать будет!
 

zarus

Хитрожопый макак
PHP:
class User {
  private $id = 0;
  public $name = '';
  public $age = '';
  public $status = '';
  function __construct($id=0) {
    if ((!empty($id))  && ($res = mysql_query('SELECT `id`,.... FROM `user` WHERE `id`='.invtval($id))) && ($row = mysql_fetch_assoc($res))) {
      $this->id = $id;
      $this->param1 = $row[...];
    }
  }
  function set_data($name,$age,$status) {
    // В прнципе, это не обязательно, так как можно и напрямую задавать атрибуты
    $this->name = $name;
    $this->age = $age;
    $this->status = $status;
  }
  function save() {
    if ((empty($this->id)) && (mysql_query('INSERT INTO `user` (`id`,....) VALUES ()'))) {
      $this->id = mysql_insert_id();
      return true;
    }
    elseif (mysql_query('UPDATE `user` SET ... WHERE `id`='.$this->id)) {
      return true;
    }
    return false;
  }
  function delete() {
    if (!empty($this->id)) {
      mysql_query('DELETE FROM `user` WHERE `id`='.$this->id);
    }
  }
}
$user = new User();
$user->set_data('name','age','status');
$user->save();
$user->set_data('name1','age1','status1');
$user->save();
$user->delete();
Такой класс позволит хранить данные о пользователе без дополнительных запросов к БД. Соответственно, если такого не требуется, то нужно хранить только id юзера, а остальные параметры передавать в save, а функцию set_data вообще изъять...
 

zarus

Хитрожопый макак
Там ошибка при описании атрибутов класса...
 
Сверху