【发布时间】:2011-08-03 18:10:17
【问题描述】:
这是我的 User 类的基本结构:
class User {
private $_userId = NULL;
private $_isAuthenticated = FALSE;
private $_code = NULL;
private $_pageLoads = 1;
private $_dbh = NULL;
const SECRET = 'shhhh its a secret';
const PAGE_LOADS = 5;
const HALF_SECOND_MS = 500000;
function __construct( PDO $dbh ) {
$this->_dbh = $dbh;
}
public function login( $username, $password ) {}
public function isAuthenticated() {}
private function _authenticate( $username, $password ) {}
private function _challenge() {}
private function _generateCode() {}
private function _protectedVars() {}
function __sleep() {}
function __wakeup() {}
public function save() {
return serialize( $this );
}
}
我正在尝试做的事情的描述
我已经使用 PHP 内置的 mysql 函数有一段时间了。对于这个项目,我决定采用更多的 OOP 方法并转向 PDO。当我用来构建“安全”环境时,我会有一个登录表单,检查用户是否存在(使用正确的密码),然后将用户 ID 保存在会话变量中(比如:$_SESSION['user_id'])和瞧。在我的安全环境中。我只需检查是否设置了 user_id 并授予他们访问权限。
现在我知道这不是一个很好的方法,而且我知道上面的代码可能会有它自己的问题(我希望你们会因为教育目的而让我见鬼去吧)。基本上我的想法是创建一个用户对象,我将在构造函数中传递我的 PDO 对象。从这个用户我可以登录,一旦所有执行完成,我会通过序列化类将用户保存在会话变量中。一旦新页面加载,唤醒功能就会被调用,我会调用未序列化的数据以确保它没有被篡改,在这种情况下,我会通过关闭 isAuthenticated 标志来注销用户(就是上面的代码)。
问题
当我尝试序列化对象时,我收到一条错误消息,告诉我 PDO 对象无法序列化。我做了一些研究,发现我必须实现 __sleep 方法并返回我想要保存的变量数组。但是,当我醒来时,如何重新初始化用户对象中的 PDO 对象?有没有一种方法可以向 unserialize 函数添加参数,并将其传递给我的 __wakeup 函数?我是不是完全走错了路,需要重新考虑一下吗?
【问题讨论】:
-
为什么要序列化全班?我不是 php 大师,我从未在任何地方看到过这种方法,但我可能会弄错。不过很有趣
-
我想我真的不需要,我只需要类中的一些变量。之后你将如何重建用户对象?我正在研究多个构造函数,但 PHP 似乎不支持它。
标签: php serialization pdo