0

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

如果我有一个带有用户的 mysql 数据库,以及一个带有两个类的 php 文件,一个 dbmanager 和一个用户类,可以在用户类中使用 dbmanager 的方法吗?

如果没有,我应该如何使用户类和数据库类相互交互?

谢谢

- -编辑 - -

这种方法对吗?例如,使用扩展类有什么好处?

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

2 回答 2

0

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

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

这在实践中意味着什么:

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

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

于 2010-12-11T20:46:56.573 回答
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 中,对象和 DB 之间的关系在 DBTable 中。您可以将 Zend Framework 视为此类模型的示例:http: //framework.zend.com/manual/en/zend.db.table.html

于 2010-12-11T20:48:57.823 回答