php中怎么存储对象,如何在PHP中的会话中存储对象?

PHP的原生$_SESSION会话透明地序列化和反序列化支持PHP的

serialization protocol或

Serializable interface的对象.您不需要显式序列化它们.

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;

现在假设您将测试改为一天而不是:

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值