ООП логика системы пользователя - PullRequest
0 голосов
/ 11 декабря 2010

Я искал подход к объектно-ориентированной пользовательской системе, но не смог найти учебник, который отвечал бы на мои вопросы. Меня действительно не волнует код, я могу сделать это позже, но логика ООП действительно убивает меня (о, я новичок в ООП, я забыл упомянуть об этом).

Если у меня есть база данных mysql с пользователями и файл php с двумя классами, dbmanager и классом пользователя, можно использовать методы dbmanager внутри класса пользователя?

Если нет, то как мне сделать, чтобы пользовательский класс и класс БД взаимодействовали друг с другом?

Спасибо

--- EDIT ---

Будет ли такой подход правильным? Каковы преимущества использования, например, расширенных классов?

    class db{
    function checkUser($login, $password){ 
        $password = sha1(md5($password)); //encrypt password
        $query = "SELECT * FROM users WHERE (login='$login' OR email='$login')";
        $result = mysql_query($query);

        if ($user = mysql_fetch_assoc($result)) {
            if ($user["password"] == $password) {
                //there's a user class somwhere else
                $checkeduser = new user($user);
                return $checkeduser;
            } else return true; //bad password
        } else return false; //user not registered
    }

    $user = $dbconnection->checkUser($login, $password); //encrypted password
    if(is_object($user)) { //if logs in
    $_SESSION["user"] = serialize($user);
        header("Location:index.php"); //go to home
    }

Ответы [ 2 ]

0 голосов
/ 11 декабря 2010

Одна из моделей заключается в том, что у вас будет общий класс, который переводит между БД и объектами, например, прочитав строку из БД и присвоив ее свойствам объекта, например:

 abstract class DBTable {
      function __construct(DBDriver $db) {
         $this->db = $db;
      }
      function loadData($id) {
          $row = $this->db->query("SELECT * FROM {$this->table_name} WHERE id=?", $id);
          foreach($row as $key => $value) {
              $this->$key = $value; 
          }
      }
  }

  class User extends DBTable {
        public $table_name = "users";
  }

  $db = new MySQLDBDriver();
  $user = new User($db);
  $user->load("joe");

Реальная обработка БД в DBManager, связь между объектами и БД в DBTable. Вы можете посмотреть на Zend Framework как пример такой модели: http://framework.zend.com/manual/en/zend.db.table.html

0 голосов
/ 11 декабря 2010

Нет абсолютно ничего плохого в использовании экземпляров одного класса внутри другого класса.Это называется составом.

Другой подход - это наследование, когда подклассы наследуют методы и свойства от родительских классов и расширяют функциональность родительского класса.

Что это означает на практике:

  • Если у вас есть пользовательский класс, который имеет экземпляр класса базы данных в качестве одного из его членов / свойств, вы можете вызвать все открытые методы класса базы данных для члена, который содержит экземпляр класса.

  • Если у вас есть пользовательский класс, который расширяет класс базы данных, вы должны иметь возможность использовать (некоторые из) методы родительского (базы данных) класса.

...