微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我的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,这可以更精细地控制对象序列化时发生的事情/反序列化.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐