У меня есть родительский объект, который я использую для общего 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
РЕДАКТИРОВАНИЕ: Должен был сказать "Private" незащищенные дочерние свойства.