OOP用户系统逻辑

时间:2010-12-11 20:38:43

标签: php oop user-management

我一直在寻找面向对象用户系统的方法,但我找不到任何能够回答我问题的教程。我真的不关心代码的东西,我以后可以这么做,但是OOP的逻辑真的杀了我(哦,我是OOP的新手,我忘了提它)。

如果我有一个带用户的mysql数据库,以及一个带有两个类的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
    }

2 个答案:

答案 0 :(得分:0)

在另一个类中使用一个类的实例绝对没有错。它被称为组合物。

另一种方法是继承,其中子类从父类继承方法和属性,并扩展父类功能。

这在实践中意味着什么:

  • 如果您的用户类具有数据库类实例作为其成员/属性之一,则可以在包含该类实例的成员上调用数据库类的所有公共方法。

  • 如果您有一个扩展数据库类的用户类,您应该能够使用(某些)父(数据库)类方法。

答案 1 :(得分:0)

其中一个模型是您将拥有在DB和对象之间进行转换的泛型类,例如:通过从DB中读取一行并将其分配给对象的属性,如下所示:

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

真正的DB处理在DBManager中,DBTable中对象与DB之间的关系。您可以将Zend Framework视为此类模型的示例:http://framework.zend.com/manual/en/zend.db.table.html