PHP   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在PHP中的会话中存储对象?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
您好我想在会话中存储或保存一个对象,使用类如SessionHandler或数组$_SESSION,我已经看到,如果我序列化对象,我可能不会丢失该对象的方法例如..
我已经看到seralizing它是可能的,但我想要存储的对象是由PDOStatement :: fetchObject()创建的,然实例类是“Users”我收到此错误

对不起,我是西班牙语,我不会说英语.
谢谢

@H_696_6@
PHP的原生$_SESSION会话透明地序列化和反序列化支持PHPserialization protocolSerializable 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()"
}

大佬总结

以上是大佬教程为你收集整理的如何在PHP中的会话中存储对象?全部内容,希望文章能够帮你解决如何在PHP中的会话中存储对象?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。