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();