gpt4 book ai didi

php - 如何在 PHP session 中存储对象?

转载 作者:可可西里 更新时间:2023-11-01 12:30:57 25 4
gpt4 key购买 nike

你好我想在 session 中存储或保存一个对象,使用像 SessionHandler 或数组 $_SESSION 这样的类,我已经看到如果我序列化对象是可能的,我不想丢失方法该对象实例..我已经看到序列化是可能的,但我想存储的对象是由 PDOStatement::fetchObject() 创建的,虽然实例类是“用户”,但我收到此错误:

PDOException: You cannot serialize or unserialize PDO instances Why? It is not a PDO instance..

对不起,我是西类牙人,我的英语说得不太好..谢谢

最佳答案

PHP 的 native $_SESSION session 透明地序列化和反序列化支持 PHP serialization protocol 的对象或 Serializable interface .您不需要显式序列化它们。

PHP 无法序列化 resources因为这些是 PHP 控制之外的一些有状态资源的句柄。这就是为什么您不能序列化 PDOPDOStatement 对象的原因。

默认情况下,通过保存所有属性名称和值来序列化对象,通过创建具有相同类的对象(不调用构造函数)并直接设置序列化属性来反序列化。您可以使用 __sleep__wakeup 魔术方法或通过实现 Serializable 接口(interface)为您的对象自定义序列化行为。但不是两者!如果您使用 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()"
}

关于php - 如何在 PHP session 中存储对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13148917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com