アプリケーションで一般的な CRUD に使用する親オブジェクトがあります。これには基本的な保存および取得メソッドがあるため、すべてのオブジェクトにそれらを再含める必要はありません。私の子オブジェクトのほとんどは、この基本オブジェクトを拡張します。これはうまくいきましたが、シリアル化された子オブジェクトを取得する際に問題が見つかりました。親オブジェクトで「取得」メソッドを使用して、子のインスタンスを作成し、シリアル化されていない子のプロパティからそれ自体を設定します。これは、オブジェクトを「自己非シリアル化」できることを意味します。
唯一の問題は、子オブジェクトに保護されたプロパティまたはプライベート プロパティがある場合、親オブジェクトはそれを読み取ることができないため、取得中に取得されないことです。
したがって、「自己非シリアル化」するより良い方法、または親オブジェクトが保護されたプロパティを「見る」ことを許可する方法を探していますが、取得プロセス中のみです。
コードの例:
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
EDITED:「プライベート」ではなく、保護された子プロパティと言うべきでした。