在自己的类中设置从PDO返回的对象

时间:2012-02-26 14:34:27

标签: php mysql pdo

我有一个名为Admin的类,它与数据库中admins表中的字段完全相同:idemail,{ {1}},pwhashpwnoncename

我的课程看起来像这样(简化):

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返回的对象分配给我所在的实例?

4 个答案:

答案 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'];

...等每个人。