php - 在php中,我取消了一个对象的属性,但是反序列化之后,属性又回来了,为什么?

标签 php serialization

我的 PHP 代码在这里:

class test {
    public $a = 'a';
    public $b = 'b';
    public $c = 'c';
}
$a = new test();
unset($a->a);
$b = serialize($a);
$c = unserialize($b);
var_dump($a, $b, $c);

为什么 $c 包含属性 a

最佳答案

unserialize 创建并初始化该类的一个新实例(尽管它不调用构造函数),然后将序列化字符串中的任何属性值映射到顶部。因为您要完全取消设置该属性,所以没有一个值可以映射回默认值,因此它在您的新对象中保持设置状态。

如果您将该属性设置为 null 而不是取消设置,那么它仍将存储在序列化副本中,并且行为最终应该与您预期的相同。

$setToNull = new test;
$unset = new test;

$setToNull->a = null;
unset($unset->a);

var_dump(unserialize(serialize($setToNull)), unserialize(serialize($unset)));

object(test)#3 (3) { ["a"]=> NULL ["b"]=> string(1) "b" ["c"]=> string(1) "c" }

object(test)#4 (3) { ["a"]=> string(1) "a" ["b"]=> string(1) "b" ["c"]=> string(1) "c" }

(不同之处在于恢复的对象仍将 a 属性设置为 null,这与取消设置它完全不同,但应该表现在大多数情况下都是一样的)

作为更复杂的解决方案(或者如果这与您实际期望的行为不匹配),那么您可以使用 PHP 的 __sleep and __wakeup magic methods在您的类上,这使您可以更细粒度地控制对象被序列化/反序列化时发生的情况。

关于php - 在php中,我取消了一个对象的属性,但是反序列化之后,属性又回来了,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53296648/

相关文章:

php - 防止下载 http 内容主体

php - 如何将两个 PDO 查询合并为一个?

java - 反序列化如何定位SerialVersionUid

Java Socket - 管道损坏错误

php - 是否存在类似反向准备语句的东西?

PHP、SQL通过php变量限制查询

php - 第一个 SQL 数据库不工作

java - 数据传输中反序列化后不是同一个对象

c# - 未调用反序列化 ctor

c# - JSON.NET,如果预期对象反序列化失败则实例化回退对象