使用序列化对象时,如何处理类中属性的可见性更改?

时间:2019-07-18 08:54:11

标签: php object serialization visibility

更新: 有人说这个问题还不清楚。我本人无法真正理解它。但是我确实找到了解决方案。 It's a PHP bug that has been resolved。运行此旧代码的服务器具有过时的php版本。

旧代码:

class MyChildClass extends MyBaseClass
{
    protected $myProp = "foo";
}

class MyBaseClass {
}

$myObject = new MyChildClass();

$myObjectS = serialize($myObject);

新代码:

class MyChildClass extends MyBaseClass
{
}

class MyBaseClass {
    public $myProp;
}
// $myObjectS is the same as in the Old code above.
$myObject = unserialize($myObjectS);

这将导致对象的受保护属性$ myProp的值为“ foo”。但是,还会有一个具有相同名称且未定义值的公共属性。

我真的不知道该如何解决。我想要的结果是使对象公共属性填充为其受保护属性的序列化对象值。

我不会通过完整对象的序列化来设计这样的代码。但这是一个遗留项目,我(暂时)必须处理这个问题。

1 个答案:

答案 0 :(得分:0)

这不容易,因为您必须更改$myObjects中所有受保护属性的出现。

在您的示例中,{s:7:"*myProp";s:3:"foo";}成为{s:6:"myProp";s:3:"foo";}
myProp的长度从7设置为6,然后移除*myProp的前导星。如果您有很多受保护的属性,则需要大量工作:/