我有一个名为Admin
的类,它与数据库中admins
表中的字段完全相同:id
,email
,{ {1}},pwhash
,pwnonce
,name
。
我的课程看起来像这样(简化):
permissions
问题是,我想使用PDO使用当前类获取对象,并将其分配给当前对象。
之前,我正在获取一个关联数组并逐个分配所有变量,但现在,因为我正在更改我的系统以使用PDO,我想让它返回{{1的实例我分配给当前的类。
例如,在class Admin {
var $id, $email, $pwhash, $pwnonce, $name, $permissions;
function auth() {
// checks the session and attempts to authenticate the user
}
function login($email,$pw) {
// authenticate the user and start a session for them.
}
}
方法中,它应该是这样的:
Admin
所以我试过了,正如我所怀疑的那样,它不会让我分配auth()
的值。但是,我仍然希望使用PDO的对象映射功能,那么如何将从PDO返回的对象分配给我所在的实例?
答案 0 :(得分:4)
如果要获取给定类的新对象,请使用PDO::FETCH_CLASS
。但是,如果要将属性值写入已有的现有对象,则使用PDO::FETCH_INTO
,如下所示:
$sth->setFetchMode(PDO::FETCH_INTO, $this);
$sth->execute();
$sth->fetch();
请注意,您要写入的属性必须可以直接访问,也可以通过__set()
魔术方法进行公开访问。
但是,你应该仔细考虑@Truth的答案。拥有相同的类(更不用相同的 object !)负责数据库访问和表示记录是不好的设计。有一个班负责管理授权记录,另一个班负责记录本身。
答案 1 :(得分:1)
而不是试图覆盖$this
,而是返回有问题的对象:
return $obj;
然后像这样使用它:
$admin = $admin->auth();
这会覆盖当前的管理对象。
虽然更好的方法是将变量分配给当前对象,或者使用抽象类,但它会更有意义。
试着大声说出你在做什么。您告诉Admin
auth()
,然后将其自身替换为经过身份验证的新Admin
。相反,您应该AdminManager
处理身份验证请求,并返回Admin
对象,或者让Admin
本身进行身份验证,然后在同一个对象中填写详细信息。 / p>
除了有意义之外,您还可以防止应用程序中的重复和内存泄漏。
答案 2 :(得分:0)
您可以使用overloading将每次调用重定向到数据库对象。
class Admin {
function auth() {
// [...]
$this->pdo_obj = $obj;
}
function __get($attribute) {
return $this->pdo_obj->$attribute;
}
// Implement __set, __isset, ... here
}
答案 3 :(得分:-4)
为$ obj命名的变量被赋予一个关联数组,这是fetch()返回的。该数组中的每个元素都有一个键,即表的列名和一个值,该值是该行和列的值。由于您的类中的实例变量与之相对应,因此您可以使用以下命令设置它们:
$this->id = $obj['id'];
$this->email = $obj['email'];
...等每个人。