【问题标题】:in php, i unset a property of object, but after unserialize , the property is back, why?在php中,我取消了对象的属性,但是在取消序列化之后,属性又回来了,为什么?
【发布时间】:2019-04-17 05:01:53
【问题描述】:

我的 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() 首先实例化一个新对象。因为你的属性有一个默认值,它会得到那个值,因为你unset()它,没有什么可以覆盖它。
  • @PraveenKumarPurushothaman 怎么是重复的?
  • @RobbyCornelissen 不是吗?
  • @PraveenKumarPurushothaman 是吗?
  • @RobbyCornelissen 在我看来是这样,但看你的评论,我觉得,它可能是......我应该重新打开它吗?

标签: php serialization


【解决方案1】:

当您调用反序列化时,将创建一个新对象。它不是完全相同的对象。

您的类具有默认值,因此当您反序列化对象并且没有设置 $a 属性时,将使用默认值。

要查看差异,请检查此代码

class test {
    public $a = 'a';
    public $b = 'b';
    public $c = 'c';
}

$a = new test();
$a->a= 'property'; // set a to "property"
unset($a->a); // remove a

$b = serialize($a);
$c = unserialize($b); // there is no "a" property set so default value will be used
var_dump($a, $b, $c);

如果您从public $a = 'a'; 中删除默认值,那么它将为空

class test {
    public $a;
    public $b = 'b';
    public $c = 'c';
}



$a = new test();
$a->a= 'property';
unset($a->a);

$b = serialize($a);
$c = unserialize($b);
echo '<pre>';
var_dump($a, $b, $c);

【讨论】:

    【解决方案2】:

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

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

    $setToNull = new test;
    $unset = new test;
    
    $setToNull->a = null;
    unset($unset->a);
    
    var_dump(unserialize(serialize($setToNull)), unserialize(serialize($unset)));
    

    对象(测试)#3 (3) { [“一”]=> 空值 ["b"]=> 字符串(1)“b” ["c"]=> 字符串(1)“c” }

    对象(测试)#4 (3) { [“一”]=> 字符串(1)“一个” ["b"]=> 字符串(1)“b” ["c"]=> 字符串(1)“c” }

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

    作为一个更复杂的解决方案(或者如果这与您实际期望的行为不匹配),那么您也许可以在您的课程中使用 PHP 的 __sleep and __wakeup magic methods,它可以让您更细粒度地控制当一个对象被序列化/反序列化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多