我一直在寻找面向对象用户系统的方法,但我找不到任何能够回答我问题的教程。我真的不关心代码的东西,我以后可以这么做,但是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
}
答案 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