PHP: способ получить свойство без геттера?
По сути, идея заключается в следующем:
Объект создается из запроса базы данных. Одно из его полей содержит закодированную строку, которая декодируется в геттере.
Проблема в том, что мне нужно создать частичную копию этого объекта. И эта копия должна содержать закодированную строку, а не декодированную версию. Очевидно, что когда я пытаюсь напрямую скопировать значение, он вызывает геттер.
Есть ли обходной путь для такой проблемы, кроме создания копии поля без геттера?
UPD: я использую магический метод, а не точно получатель (мой плохой, первый вопрос)
public function __get($property){
...
case 'version':
return $this->_getVersion();
}
Клонирование объекта - это не тот случай, поскольку второй объект также происходит из БД, и ему просто необходимо заменить некоторые поля, например
$item1->version = $item2->version;
2 ответа
В итоге я нашел оптимальный способ сделать это.
Я переместил функцию декодирования из метода __get() в метод __set(). Теперь я храню закодированную строку только в БД, а декодированный массив - только в модели.
Тем самым я гарантирую, что данные, хранящиеся в поле, одного типа. Также я проверяю, хранится ли массив в поле. Это указывает, были ли данные уже декодированы.
class AClass
{
private $someProperty = 'SSBwcm92aWRlIHRoZSBiZXN0IHNvbHV0aW9ucyE=';
public function getSomeProperty()
{
return base64_decode($this->someProperty);
}
}
// Get the instance.
$object = new AClass;
// Get the property.
$property = (new ReflectionClass($object))->getProperty('someProperty');
// Make it accessible.
$property->setAccessible(true);
// Get the value of the property for the instance.
echo $property->getValue($object);
выходы:
SSBwcm92aWRlIHRoZSBiZXN0IHNvbHV0aW9ucyE =