PHP在父级中访问子级的私有属性

我在应用程序中有一个用于通用CRUD的父对象-它具有基本的save&检索方法,因此我不必将它们重新包含在我的所有对象中.我的大多数子对象都扩展了此基础对象.这个工作正常,但是我发现检索序列化的子对象存在问题.我在父对象中使用“检索”方法,该方法创建子对象的实例,然后从未序列化的子对象的属性填充自身-这意味着可以“自我反序列化”对象.

唯一的问题是-如果子对象具有受保护或私有属性,则父对象无法读取它,因此在检索过程中不会将其拾取.

因此,我正在寻找“自我反序列化”的更好方法或允许父对象“查看”受保护的属性的方法-但仅限于在检索过程中使用.

代码示例:

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

编辑:应该说“私人”未受保护的子财产.

解决方法:

似乎相同的类可见性策略不适用于继承的/父类. php文档未解决此问题.

我建议您声明检索方法为静态,并通过静态调用而不是当前的“自我反序列化”方法来获取$cleanTester.

static function retrieve() {
  $serialized = file_get_contents(SOME_FILENAME);
  return unserialize($serialized);
}

[...]

$cleanTester = BaseObject::retrieve();

或者,您可以利用__get()方法来访问不可访问的属性…我相信可以将其添加到BaseObject类中,并从子类中获取受保护的属性.由于相同的类可见性策略应应用于BaseObject,因此您可以定义__get()方法private或protected.

BaseObject {
  private function __get($propertyName) {
    if(property_exists($this,$propertyName))
      return $this->{$propertyName};

    return null;
  }
上一篇:php-将我的数据库类与项目中的其他类一起使用


下一篇:javascript-原型和document.getElementById()