2010-12-11 3 views
0

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

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

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

Благодаря

--- 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 
    } 

ответ

0

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

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

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

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

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

+0

Thanks code_burgar. Вчера я сделал другой подход самостоятельно, можете ли вы сказать мне, правильно ли это или использовать расширенные классы? (посмотрите на издание) –

0

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

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

Спасибо StasM, что очень помогает. Вчера я сделал другой подход сам, не могли бы вы сказать мне, правильно ли это? (посмотрите на издание) –