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

Php 在其自己的类中设置从PDO返回的对象,php,mysql,pdo,Php,Mysql,Pdo,我有一个名为Admin的类,它的字段与数据库中admins表中的字段完全相同:id,email,pwash,pwnice,name,permissions 我的班级看起来像这样(简化下来): 问题是,我想使用PDO使用当前类获取对象,并将其分配给当前对象 以前,我获取一个assoc数组并逐个分配所有变量,但现在,由于我将我的系统更改为使用PDO,我想让它返回一个Admin类的实例,我将其分配给当前的一个 例如,在auth() function auth() { if (!isset($

我有一个名为
Admin
的类,它的字段与数据库中
admins
表中的字段完全相同:
id
email
pwash
pwnice
name
permissions

我的班级看起来像这样(简化下来):

问题是,我想使用PDO使用当前类获取对象,并将其分配给当前对象

以前,我获取一个assoc数组并逐个分配所有变量,但现在,由于我将我的系统更改为使用PDO,我想让它返回一个
Admin
类的实例,我将其分配给当前的一个

例如,在
auth()

function auth() {
     if (!isset($_SESSION['id'])) return false;
     $id = $_SESSION['id'];

     // create PDO connection and assign to $dbh

     $sth = $dbh->prepare('SELECT * FROM admins WHERE id = ?');
     $sth->execute(array($id));
     $sth->setFetchMode(PDO::FETCH_CLASS,get_class($this));
     $obj = $sth->fetch();
     if (!is_object($obj)) return false;

     $this = $obj; // I know this won't work, but anyway...
}

所以我尝试了,正如我所怀疑的,它不允许我分配
$this
的值。但是,我仍然希望使用PDO的对象映射功能,因此如何将从PDO返回的对象分配给我所在的实例?

将为名为$obj的变量分配一个关联数组,这就是fetch()返回的数组。该数组中的每个元素都有一个键(表的列名)和一个值(该行和列的值)。由于类中的实例变量与相同的实例变量相对应,因此可以使用以下参数设置它们:

$this->id = $obj['id'];
$this->email = $obj['email'];
…等等。

您可以使用将每个调用重定向到数据库对象

class Admin {
  function auth() {
    // [...]

    $this->pdo_obj = $obj;
  }

  function __get($attribute) {
    return $this->pdo_obj->$attribute;
  }

  // Implement __set, __isset, ... here
}

而不是试图覆盖
$this
,返回有问题的对象:

return $obj;
然后像这样使用它:

$admin = $admin->auth();
这将覆盖当前的管理对象


虽然更好的方法是将变量分配给当前对象,或者使用抽象类,但这样做更有意义

试着大声说出你在做什么。您正在将
管理员
告知
auth()
,然后将其自身替换为经过身份验证的新
管理员
。相反,您应该让
AdminManager
处理身份验证请求,并返回
Admin
对象,或者让
Admin
本身进行身份验证,然后在同一对象中填写详细信息

除了有意义之外,还可以防止应用程序中的重复和内存泄漏。

如果要获取给定类的新对象,可以使用
PDO::fetch_class
。但是,如果要将属性值写入现有对象,可以使用
PDO::FETCH_INTO
,如下所示:

 $sth->setFetchMode(PDO::FETCH_INTO, $this);
 $sth->execute();
 $sth->fetch();
请注意,要写入的属性必须是可公开访问的,可以直接访问,也可以通过
\u set()
magic方法访问


但是,你应该仔细考虑“真理”的答案。让同一个类(更不用说同一个对象!)同时负责数据库访问和表示记录是不好的设计。有一个类负责管理授权记录,另一个类负责记录本身。

我认为这就是
PDO::FETCH_ASSOC
的目的?我使用的是
PDO::FETCH_CLASS
。什么是
$this->getClass()
,它返回什么?它应该以字符串形式返回类的名称。@FrancisAvila woops-我的意思是
get\u class($this)
 $sth->setFetchMode(PDO::FETCH_INTO, $this);
 $sth->execute();
 $sth->fetch();