我有一个父对象,用于在我的应用程序中进行通用CRUD操作——它具有基本的保存和检索方法,因此我不必在所有对象中重新包含它们。我的大多数子对象都扩展了这个基础对象。这一直很好用,但是我发现一个问题,就是检索序列化的子对象时出现问题。我在父对象中使用“retrieve”方法创建一个子对象实例,然后从未序列化的子对象的属性中填充自己,这意味着它可以“自我反序列化”对象。
唯一的问题是,如果子对象具有受保护或私有属性,则父对象无法读取它,因此在检索过程中不会被捕获。
因此,我要么寻找更好的“自我反序列化”方式,要么允许父对象“看到”受保护的属性——但仅在检索过程中。
以下是代码示例:
唯一的问题是,如果子对象具有受保护或私有属性,则父对象无法读取它,因此在检索过程中不会被捕获。
因此,我要么寻找更好的“自我反序列化”方式,要么允许父对象“看到”受保护的属性——但仅在检索过程中。
以下是代码示例:
BaseObject {
protected $someparentProperty;
public function retrieve() {
$serialized = file_get_contents(SOME_FILENAME);
$temp = unserialize($serialized);
foreach($temp as $propertyName => $propertyValue) {
$this->$propertyName = $propertyValue;
}
}
public function save() {
file_put_contents(SOME_FILENAME, serialize($this));
}
}
class ChildObject extends BaseObject {
private $unretrievableProperty;
public setProp($val) {
$this->unretrivableProperty = $val;
}
}
$tester = new ChildObject();
$tester->setProp("test");
$tester->save();
$cleanTester = new ChildObject();
$cleanTester->retrieve();
// $cleanTester->unretrievableProperty will not be set
编辑:应该说“私有”而不是受保护的子属性。