您好我想在会话中存储或保存一个对象,使用类如SessionHandler或数组$_SESSION,我已经看到,如果我序列化对象,我可能不会丢失该对象的方法例如..
我已经看到seralizing它是可能的,但我想要存储的对象是由PDOStatement :: fetchObject()创建的,虽然实例类是“Users”我收到此错误:
我已经看到seralizing它是可能的,但我想要存储的对象是由PDOStatement :: fetchObject()创建的,虽然实例类是“Users”我收到此错误:
PDOException: You cannot serialize or unserialize PDO instances
Why? It is not a PDO instance..
对不起,我是西班牙语,我不会说英语.
谢谢
PHP的原生$_SESSION会话透明地序列化和反序列化支持PHP的
serialization protocol或
原文链接:https://www.f2er.com/php/137833.htmlSerializable
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()" }