更新: 有人说这个问题还不清楚。我本人无法真正理解它。但是我确实找到了解决方案。 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”。但是,还会有一个具有相同名称且未定义值的公共属性。
我真的不知道该如何解决。我想要的结果是使对象公共属性填充为其受保护属性的序列化对象值。
我不会通过完整对象的序列化来设计这样的代码。但这是一个遗留项目,我(暂时)必须处理这个问题。
答案 0 :(得分:0)
这不容易,因为您必须更改$myObjects
中所有受保护属性的出现。
在您的示例中,{s:7:"*myProp";s:3:"foo";}
成为{s:6:"myProp";s:3:"foo";}
。
将myProp
的长度从7
设置为6
,然后移除*myProp
的前导星。如果您有很多受保护的属性,则需要大量工作:/