我有一个父对象,我在我的应用程序中用于一般CRUD - 它具有基本保存&检索方法,因此我无需将它们重新包括在我的所有对象中。我的大部分子对象都扩展了这个基础对象。这工作得很好,但我发现检索序列化的子对象有问题。我在创建子实例的父对象中使用“检索”方法,然后从反序列化子的属性中填充自身 - 这意味着可以“自我解序列化”对象。PHP在父项中访问子项的私有属性
唯一的问题是 - 如果子对象具有受保护属性或私有属性,则父对象无法读取它,因此它在检索过程中不会被拾取。
所以我正在寻找更好的方法来“自我反序列化”或一种方法来允许父对象“看到”受保护的属性 - 但只有在检索过程中。代码
例子:
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
编辑:应该说 “私人” 不受保护子属性。
感谢。静态方法看起来是可行的 - 但事实上,一些子对象需要安装,并且在可以计算出应该从中检索的文件名之前进行一些处理。 __get已经用于这个目的 - 但是当我遍历对象的属性时,父类也不知道需要什么属性。我想我需要看看迭代方法 - 感谢指针。 – Hippyjim 2010-08-14 17:07:41