您好我想在会话中存储或保存一个对象,使用像 SessionHandler 或数组 $_SESSION 这样的类,我已经看到如果我序列化对象是可能的,我不想丢失该对象的方法实例..我已经看到序列化它是可能的,但我想要存储的对象是由 PDOStatement::fetchObject() 创建的,尽管实例类是“用户”我得到这个错误:
PDOException: 你不能序列化或反序列化 PDO 实例 为什么?它不是 PDO 实例..
对不起,我是西班牙人,我的英语不太好..谢谢
您好我想在会话中存储或保存一个对象,使用像 SessionHandler 或数组 $_SESSION 这样的类,我已经看到如果我序列化对象是可能的,我不想丢失该对象的方法实例..我已经看到序列化它是可能的,但我想要存储的对象是由 PDOStatement::fetchObject() 创建的,尽管实例类是“用户”我得到这个错误:
PDOException: 你不能序列化或反序列化 PDO 实例 为什么?它不是 PDO 实例..
对不起,我是西班牙人,我的英语不太好..谢谢
PHP 的本$_SESSION
机会话透明地序列化和反序列化支持 PHP序列化协议或Serializable
接口的对象。您不需要显式序列化它们。
PHP 无法序列化resources
,因为这些是 PHP 无法控制的一些有状态资源的句柄。这就是您不能序列化PDO
或PDOStatement
对象的原因。
默认情况下,通过保存所有属性名称和值来序列化对象,并通过创建具有相同类的对象(不调用构造函数)并直接设置序列化属性来取消序列化。您可以使用__sleep
和__wakeup
魔术方法或通过实现Serializable
接口来自定义对象的序列化行为。但不是两者都有!如果您使用implements Serializable
,__sleep
并被__wakeup
忽略。
一个重要的注意事项:使用对象序列化时,您必须在反序列化之前加载类定义(或具有可以加载它的自动加载器),并且它必须与被序列化的对象的类定义相匹配。类定义不存储在序列化数据中。
例如,假设您有以下内容:
class Test {
public $version = 1;
protected $abc;
public function setAbc($abc) {
$this->abc = $abc;
}
}
$t = new Test();
$t->setAbc(123);
$_SESSION['mytest'] = $t;
现在想象一下,Test
有一天你会变成这样:
class Test {
public $version = 2;
private $def;
public function setDef ($def) {
$this->def = $def;
}
}
现在假设您在新代码中加载了一个Test
在版本 1 时序列化的对象:
$t = $_SESSION['mytest']; // this was stored yesterday, when Test was version 1
var_dump($t)
你会得到这个:
object(Test)#1 (3) {
["version"]=>
int(1)
["def":"Test":private]=>
NULL
["abc":protected]=>
int(123)
}
此外,您不能使用旧方法:
if ($t->version == 1) { // Check for class version
$t->setAbc(345); // "Fatal error: Call to undefined method Test::setAbc()"
}