php 訪問父,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;

}

标签:oop,serialization,protected,php

来源: https://codeday.me/bug/20191209/2097221.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值